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
  • 相关阅读:
    SQL Server 索引基本概念与优化
    将Heap RID转换成RID格式
    有关DeadLock的文章列表
    sql报字段过大的错误解决方法
    查询当天数据(mysql)
    cookie和session的区别
    get和post的区别
    jq点击切换按钮最简洁代码
    js提示确认删除吗
    thinkphp解决分页后序列号自增的问题
  • 原文地址:https://www.cnblogs.com/KSTT/p/10366814.html
Copyright © 2011-2022 走看看