bzoj1816: [Cqoi2010]扑克牌(二分答案判断)

1816: [Cqoi2010]扑克牌

题目:传送门

题解:

   被一道毒瘤题搞残了...弃了坑来刷刷水题

   一开始还想复杂了...结果发现二分水过:

   二分答案...然后check一下,joker肯定尽量用mid次,那么哪种牌不够就补(因为每次只能补一种,所以如果次数用完就return false)

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,m,ans;
 8 int a[1100];
 9 bool check(int x)
10 {
11     int s=min(m,x);
12     for(int i=1;i<=n;i++)
13     {
14         if(a[i]<x)
15         {
16             s=s-(x-a[i]);
17             if(s<0)return false;
18         }
19     }
20     return true;
21 }
22 int main()
23 {
24     scanf("%d%d",&n,&m);
25     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
26     int l=0,r=999999999;ans=0;
27     while(l<=r)
28     {
29         int mid=(l+r)/2;
30         if(check(mid)==true)
31         {
32             l=mid+1;
33             ans=mid;
34         }
35         else r=mid-1;
36     }
37     printf("%d\n",ans);
38     return 0;
39 }

原文地址:https://www.cnblogs.com/CHerish_OI/p/8511457.html

时间: 2024-10-09 18:50:11

bzoj1816: [Cqoi2010]扑克牌(二分答案判断)的相关文章

BZOJ 1816: [Cqoi2010]扑克牌( 二分答案 )

二分答案.. 一开始二分的初始右边界太小了然后WA,最后一气之下把它改成了INF... ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i

【BZOJ1816】[Cqoi2010]扑克牌 二分

[BZOJ1816][Cqoi2010]扑克牌 Description 你有n种牌,第i种牌的数目为ci.另外有一种特殊的牌:joker,它的数目是m.你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌.比如,当n=3时,一共有4种合法的套牌:{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}. 给出n, m和ci,你的任务是组成尽量多的套牌.每张牌最多只能用在一副套牌里(可以有牌不使用). Input 第一行包含两个整数n, m

bzoj1816: [Cqoi2010]扑克牌

二分答案. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) const int inf=0x7f7f7f7f; int c[55],n,m; bool check(int x){ int cnt=min(x,m); rep(i,n) i

bzoj 1816: [Cqoi2010]扑克牌

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int l,r,m,n,a[60],ans; 5 bool pan(int x) 6 { 7 int a1=min(x,m); 8 for(int i=1;i<=n;i++) 9 if(a[i]<x) 10 { 11 a1-=x-a[i]; 12 if(a1<0) 13 return 0; 14 } 15 return 1; 16 }

FZU2056 最大正方形(二分答案)

Problem 2056 最大正方形 Accept: 171    Submit: 516Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 现在有一个n*m的矩阵A,在A中找一个H*H的正方形,使得其面积最大且该正方形元素的和不大于 limit.  Input 第一行一个整数T,表示有T组数据. 每组数据 第一行三个非负整数 n m limit 接着 n 行,每行 m 个整数. 0 < n <= 1000

[BZOJ 1816][Cqoi2010]扑克牌(二分答案)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1816 分析: 我先以为是道水题,但是要注意的是每套牌中Joker只能用1张的,所以就出现了可能目前每种牌的剩余牌数都够,但不一定不用Joker,然后就短路了…… 看了hzwer的blog顿时茅塞顿开,原来是二分…… 二分答案x,然后判定 判定的方法:注意每套牌顶多只有一个Joker,所以对于答案x,能用的Joker的最大数量是T=Min(x,m),然后枚举每种牌,将每种牌相对于答案x差的个数

[BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因为,当使用的joker小于等于 x 时,才可以通过合适地安排顺序使得每组牌中至多有一张 joker . 代码 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio>

二分答案 扑克牌

1 program hehe; 2 var 3 n,m,i,j:longint; 4 c:array[0..50] of longint; 5 6 function min(a,b:longint):longint; 7 begin 8 if a>b then exit(b); 9 exit(a); 10 end; 11 12 function ok(a:longint):boolean; 13 var 14 f,t:longint; 15 begin 16 t:=min(a,m); 17 fo

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store