【洛谷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-

posted @ 2019-02-19 14:52  Sweetness  阅读(425)  评论(0编辑  收藏  举报