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

  • 相关阅读:
    动态加载方法(定时任务)
    安装 asp.net core 出错
    .NET:权限管理
    关于随机数
    博客园首弹
    C# MVC从其他系统获取文件流,显示文件
    Python中操作MySQL步骤
    MySql之_增删改查
    数据库之_SQL注入
    为什么上传到youtube上的视频很模糊
  • 原文地址:https://www.cnblogs.com/zhuier-xquan/p/10401046.html
Copyright © 2020-2023  润新知