• Codeforces Round #469 (Div. 2) F. Curfew


    贪心

    题目大意,有2个宿管分别从1和n开始检查房间,记录人数不为n的房间个数,然后锁住房间。

    没有被锁的房间中的学生可以选择藏在床底,留在原地,或者转移(最远转移d个房间)

    然后抄了网上大神的代码。

    首先,如果可以转移的人数够,能使外面的满足房间b人的条件,就尽量满足。如果人数不够,就全部向内进行转移。

    所有的人都可以不断向内转移,所以最优的一种情况一定不会发现某个房间人数多了。。(除了最靠内的房间)

    然后保存一个区间和,一个房间一个房间进行判断。

    这个思路好妙啊

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #define LL long long
    using namespace std;
    const int inf = 0x3f3f3f3f;
    const LL LLinf = 0x3f3f3f3f3f3f3f3f;
    LL read()
    {
           LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10ll+ch-'0';ch=getchar();}
        return x*f;
    }
    
    const int maxn = 200000 + 10;
    LL n,d,b;
    LL s[maxn];
    LL ans1,ans2;
    
    LL query(LL l,LL r)
    {
        if(r>n) r=n;
        if(l<1) l=1;
        return s[r]-s[l-1];
    }
    
    void build()
    {
        n=read(); d=read(); b=read();
        for(int i=1,a;i<=n;i++) 
        {
            a=read();
            s[i]=a+s[i-1];    
        }
    }
    
    void solve()
    {
        for(int i=1;i<=n/2;i++) 
        {
            if(query(1,i+i*d)>=(ans1+1)*b) ans1++;  
            if(query(n-i+1-i*d,n)>=(ans2+1)*b) ans2++; 
        }
        cout<<max(n/2-ans1,n/2-ans2)<<'
    ';
    }
    
    int main() 
    {
        build();
        solve();
        
        return 0;
    }
  • 相关阅读:
    文件系统EXT3,EXT4和XFS的区别
    怎么让系统开机运行一个脚本:
    Linux系统的开机启动顺序:
    Linux根目录扩容方法及其涉及的相关磁盘操作
    创建账户和授权的作业
    crontab 定时任务:
    Ubuntu系统Daphne + Nginx + supervisor部署Django项目
    mysql离线安装
    mongodb集群运维
    nodeexporter新增自定义模块
  • 原文地址:https://www.cnblogs.com/invoid/p/8668881.html
Copyright © 2020-2023  润新知