1. 程式人生 > >合並果子

合並果子

合並 width bre com idt std 分享 algorithm 這一

https://www.luogu.org/problemnew/show/P1090

初次思路

技術分享圖片

但是這樣做的思路是錯誤的,一分都沒有,後來經過推理可得

技術分享圖片

註意點:開始時先進行一次排序,然後每次都只有一個值因為相加改變,所以之後只需遍歷一次

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,a[10010];
int sum=0; 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int x;
	sort(a+1,a+1+n);
	while(1){
		x=1;
		if(a[x]==0)x++;
		if(x==n)break;
		a[x]+=a[x+1];
		sum+=a[x];
		for(int i=x+1;i<n;i++)
			a[i]=a[i+1];//替換
		n--;
		for(int i=x;i<n;i++)
			if(a[i]>a[i+1])//因為之前有排序的基礎,而唯一改變的是a[x]
				swap(a[i],a[i+1]);//這一輪交換就是為a[x]找一個適當的位置 		 
	}
	printf("%d",sum);
	return 0;
}

總結:做貪心的題,一定要多舉幾個例子來驗證,不要只看著樣例想

合並果子