zoukankan      html  css  js  c++  java
  • 扑克牌(cards)

    扑克牌
    思路

    这题也是二分!!

    我们二分有几套牌,然后再去检验是否符合,至于怎么想到的,不要问我,我也不知道

    那么我们主要解决的就是check函数

    我们将二分的套数和每种牌的数量进行比较,如果该种牌的数量大于mid,我们就不用管,如果小于的话我们就要将差值相加(代表我们要使用多少张鬼牌)

    统计完后我们就判断对吧,我们判断我们统计出来所需要的鬼牌数量是否满足于小于题目给的鬼牌数量的同时也要小于mid,如果满足就返回mid(其实我最开始不懂这里,后来才知道只有统计出来的数小于mid,才可能满足题目的要求,即每套牌只能出现一张鬼牌)

    代码就特别简单啊

    代码
    #include<bits/stdc++.h>
    #define ll long long
    #define FOR(i,a,b) for(register int i=a;i<=b;i++)
    #define ROF(i,a,b) for(register int i=a;i>=b;i--)
    using namespace std;
    int n,m;
    int a[80];
    int scan()
    {
        int as=0,f=1;
        char c=getchar();
        while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
        while(c>='0'&&c<='9'){as=(as<<3)+(as<<1)+c-'0';c=getchar();}
        return as*f;
    }
    bool chek(int mid)
    {
        ll tot=0;
        FOR(i,1,n) if(a[i]<mid) tot+=mid-a[i];
        if(tot<=min(m,mid)) return 1;
        return 0;
    }
    int main()
    {
        n=scan();
        m=scan();
        int maxx=0;
        FOR(i,1,n)
        {
            a[i]=scan();
            maxx=max(a[i],maxx);
        }
        int l=0,r=maxx+m+1,ans=0;
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(chek(mid))
            {
                ans=mid;
                l=mid+1;
            }
            else r=mid;
        }
        cout<<ans;
        return 0;
    }
    View Code
  • 相关阅读:
    iOS学习05C语言函数
    iOS学习04C语言数组
    iOS学习03C语言循环结构
    iOS学习02C语言分支结构
    iOS学习01C语言数据类型
    Objective-C学习——中文URL编码和解码
    Objective-c 字面量
    SDWebImage
    mac的svn之cornerstone简易教程
    javascript 和oc交互
  • 原文地址:https://www.cnblogs.com/KSTT/p/10366814.html
Copyright © 2011-2022 走看看