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; }
总结:做贪心的题,一定要多举几个例子来验证,不要只看着样例想