zoukankan      html  css  js  c++  java
  • 【Round #36 (Div. 2 only) C】Socks Pairs

    【题目链接】:https://csacademy.com/contest/round-36/task/socks-pairs/

    【题意】

    给你n种颜色的袜子,每种颜色颜色的袜子有ai只;
    假设你在取袜子的时候不看取出来的是什么颜色,也不看抽屉里面;
    问你最少要取多少只,才能保证,里面至少有k双袜子;

    【题解】

    先特判无解的情况;
    a[i]2<k,则无解;
    如果有解;
    则,先每种颜色的袜子都取一只;
    这是最坏的情况了;
    接下来,每种颜色的袜子都连续两双的取;
    比如现在你有3只袜子了,一共也只有3种颜色的袜子供选;
    你所拥有的3只,每只的颜色都不同;
    然后再让你取;
    你肯定是某种颜色的袜子再连续取2只;
    这样,2只才贡献一个新的颜色;
    而不是选两个不同的颜色,那样两只就贡献两个颜色了,不是最坏情况;
    这样,我们先把所有的a[i]都减去1;
    然后每种袜子都两只两只地取;
    (奇数的话,1留着);
    如果这样取够k双袜子了,则输出(k-1)*2+n+1
    这里(k-1)*2表示取(k-1)次两双两双的情况,n是一开始取的n只不同颜色的袜子;
    这时再取一只,就能保证有k只袜子了;
    如果这样取不够k只袜子;
    因为我们已经判断过有解,则减过1之后为奇数的a[i],选完之后,就只剩一只袜子可以选了,这里的1只的个数肯定够凑满k双袜子了,只不过选一只就要增加一对了..
    这也是为什么它要放在连续两只后再考虑的原因;
    这种情况下答案为已选的袜子对数*2+n+k-已选的袜子对数

    【Number Of WA

    3

    【反思】

    比赛的时候完全没想到,每种袜子都是独立的,可以分开来连续两只地选.
    以为要全都一样的数量一起两只两只选.
    思维僵化…
    最后稀里糊涂地就水过了。。

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 1e5;
    
    int n,k;
    LL a[N+100],d[N+100],tans = 0;
    
    void sp(){
        LL cnt = 0;
        rep1(i,1,n) cnt = cnt + a[i]/2;
        if (cnt < k){
            cout << -1 << endl;
            exit(0);
        }
    }
    
    int main(){
        //Open();
        Close();
        cin >> n >> k;
        rep1(i,1,n)
            cin >> a[i];
        sp();
        rep1(i,1,n) a[i]--;
        LL now = 0;
        rep1(i,1,n){
            now += a[i]/2;
            tans += a[i]/2*2;
        }
        if (now >= k){
            cout << (k-1)*2 + n + 1 << endl;
        }else{
            cout << tans + k - now << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    spring框架学习(六)AOP
    spring框架学习(五)注解
    spring框架学习(三)
    spring框架学习(四)自动装配
    spring框架学习(二)依赖注入
    解决Photoshop不支持webp格式图片问题
    计算机导论-5、6
    计算机导论-3、4
    计算机导论-1、2
    Android SDK Manager国内下载缓慢的问题
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626217.html
Copyright © 2011-2022 走看看