【洛谷p1031】均分纸牌
【博客园的第一条随笔,值得纪念一下】
洛谷上的算法标签是
这道题是一道贪心题,过了四遍才过(蒟蒻有点废)
第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值;
这样出来的结果永远是n-1,只过了一个点。
附上错误想法(不要被误导):
#include<iostream> #include<cstdio> using namespace std; int n,a[10001],sum=0,c[10001],b,ans=0; int t(); int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; } b=sum/n; t(); } int t() { for(int i=1;i<=n;i++) c[i]=a[i]-b; for(int j=2;j<=n;j++) { c[j]+=c[j-1]; ans++; } cout<<ans<<endl; }
第二遍就慌了,也只过了一个点。
第二遍的时候在第一步基础上加了if语句,然鹅还是错的。
连错两遍,我慌了。第三遍仔细的拿纸笔想了一下错误是怎么造成的(但只是拿洛谷下载下来的错误的测试数据),虽然测试数据对了,然鹅只是对于测试数据程序是合适的,对其他例子就不合适了【所以提醒做题一定不能看个例,要看整体】
第四次真的深思熟虑了一番,改进了许多,终于过了。
附上ac代码:
#include<iostream> #include<cstdio> using namespace std; int n,a[10001],sum=0,c[10001],b,ans=0; int t(); int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; } b=sum/n; t(); } int t() { for(int i=1;i<=n;i++) c[i]=a[i]-b; int i=1,j=n; while(c[i]==0&&i<n) i++; while(c[j]==0&&j>1) j--; while(i<j) { c[i+1]+=c[i]; c[i]=0; ans++; i++; while(c[i]==0&&i<j)i++; } cout<<ans<<endl; }
end-