• 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;
    }
  • 相关阅读:
    HTML <button> 标签
    git帮助命令
    PHP从数组中删除元素的方法
    thinkphp里面的or查询
    登录操作中的记住密码操作的算法逻辑
    重复密码需一致的表单实例
    判断 checkbox 是否选中以及 设置checkbox选中
    update和saveOrUpdate具体解释
    gopkg:一种方便的go pakcage管理方式
    一次正确选择,改变一生命运!
  • 原文地址:https://www.cnblogs.com/invoid/p/8668881.html
Copyright © 2020-2023  润新知