曹文夏令营 2016 普及组 第贰轮 游戏

游戏

以下是原题

【问题描述】
/*“Ran,今天我要在Hakase 家打游戏,不回来了。”
“Ran,Hakase 新发明了游戏,我今天住博士家。”
“Ran,Conan 今天要在我家通宵打游戏。”
终于有一天,电脑被打坏了……2333
所以Conan 要前往专卖店买新的,正好专卖店正在促销,*/

一共有三种礼包:
豪华礼包:一个U 盘、一个鼠标和一个机械键盘。
幸运礼包:一个U 盘、两个鼠标。
普通礼包:两个U 盘、一个鼠标。
卖店内准备了a 个U 盘、b 个鼠标和c 个机械键盘。为了给顾客带来足
够多的惊喜,店长希望相邻两位领礼包的顾客拿到的礼包类型都是不同的。店长
想知道这些奖品最多可以发出多少份礼包。可是店长毕竟没有Conan 聪明,所以
请教Conan,可是Conan 要急着回去打游戏,所以就交给你啦。
【输入格式】
从文件store.in 中读入数据。
输入第一行包含一个正整数T。
接下来T 行每行包含3 个正整数a, b, c,依次表示U 盘、鼠标和机械键盘各
有多少个。
【输出格式】
输出到文件store.out 中。
输出T 行,每行一个整数,表示最多能发出多少份礼包。
【样例输入】
24
4 0
1 1 1
【样例输出】
2
1
【数据规模与约定】
对于 30%的数据满足T<=10,a,b,c<=30。
对于 60%的数据满足T<=100,a,b,c<=300,000。
对于 100%的数据满足T<=100000,0<=a,b,c<=1,000,000。

====================分==============割================线========================

所以实际上这道题实际上就是有a个U盘,b个鼠标,c个键盘,将它们分成不连续的三种礼包,求最多能分出多少礼包。

首先根据数据范围算复杂度,⑩万的数据最大也就只能用O(n*logn)左右的算法了。答案仅为最多礼包数,T组数据,

所以二分枚举答案是首选。接下来就是如何检验枚举出来的数是否成立了,对于我们枚举出的x,

在满足相邻礼包不相同的条件下,三种礼包中 (送出礼包数较小两种的礼包数量之和)>=x/2。再来看这三种礼包:

  U盘 鼠标 机械键盘
豪华礼包 1 1 1
幸运礼包 1 2  
普通礼包 2 1  

不难发现,每一种礼包都是一个U盘、一个鼠标,再加上 { U盘、鼠标、机械键盘 } 中三选一构成,

就是说每个礼包的保底是1个U盘和1个鼠标,外加上三选一,

所以验证方法实际上就出来了:

a个U盘,b个鼠标,c个键盘,枚举的x个礼包,首先需要a>=x,b>=x,

然后a,b都减去x,剩余a,b,c的值就是对应的普通、幸运、豪华礼包个数,

a,b,c中两两相加之和最小的如果>=x/2,则此方案成立。

#include<cstdio>
int T,a,b,c,l,r,mid,ans;
bool ch(int x)
{
    int a1=a,b1=b,c1=c;
    a1-=x;b1-=x;
    if(a1<0||b1<0)return 0;
    int mi=a1+b1;
    if(a1+c1<mi)mi=a1+c1;
    if(b1+c1<mi)mi=b1+c1;
    if(mi<x/2)return 0;
    return 1;
}
int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&a,&b,&c);
        l=0;r=(a+b+c)/3;mid=(l+r)/2;
        while(l+5<r)//二分时左右间距开到5会容错率高一点(笑
        {
            if(!ch(mid))r=mid-1;
            else l=mid;
            mid=(l+r)/2;
        }ans=l;
        for(int i=l;i<=r;i++)
        {
            if(!ch(i))break;
            ans=i;
        }
        printf("%d\n",ans);
    }
}

//高中生来水普及组的题真?丢人

时间: 2024-12-25 05:46:46

曹文夏令营 2016 普及组 第贰轮 游戏的相关文章

NOIP 2016 普及组Solution

第一题 直接贴Code: 1 #include <cstdio> 2 int min(int a,int b) 3 { 4 return a<b?a:b; 5 } 6 using namespace std; 7 int main() 8 { 9 int n,a1,a2,b1,b2,c1,c2,ans; 10 scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&b1,&b2,&c1,&c2);

2016普及组t3海港

好的,说说这道题的思路,爆搜队列嘛: 用一个结构体队列存每个人来的时间和他的国籍,用一个vis数组存每个人来的次数,是第一次来sum便加一. 然后从前面第一个人开始扔(原谅我用这个词,因为我找不到更好的词了)下船,直到第一个人与当前这艘船相差没超过1天即可,每扔一个人便vis[此人国籍]减一,当这个人来的次数为0时,sum减一. 就这样,既不爆时间也不爆空间,完美! #include<cstdio> #include<cstdlib> #include<cmath> #

[NOIP2014普及组]比例简化

题目地址: ayyzvijos:http://pingce.ayyz.cn/vijos/Problem_Show.asp?id=2016 vijos:https://vijos.org/p/1912 COGS:http://218.28.19.228/cogs/problem/problem.php?pid=1810 题目来源:NOIP2014普及组第二题 问题分析:题目描述很长,归纳起来,大意就是: 在区间[1,L]内求出2个数A’.B’,这两个数满足: 一.gcd(A’,B’)=1,即A’和

NOIP1999普及组解题报告

不知怎么地,洛谷的noip1999普及组的题和以前考的不一样 /雾 回文数 分析:一道高精度加法的模拟题,注意还有16进制. #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn=150; int n,len=0,a[maxn]; char s[maxn]; bool is_h(){ for(in

【NOIP2017普及组】赛后心得

我觉得可能今生再也见不到这么简单的题目了--甚至有种能AK的错觉(不 然而考场上脑壳疼了,只剩下310~330. T4告诉我以后遇到不会的东西一定要早点学-- 题目分析 T1 分数 这次连模拟都不用了,干脆叫你输出三个数的和. 要不明年直接改成A+B Problem好了. T2 图书管理员 不难,就是坑,特别坑. 如果有前导零会坑死一堆人,可能很多人没AK不会在T4而是T2(笑). 不过我还是相信CCF不会像kpm一样出前导零. 要是出了我就完了. T3 棋盘 简单到不行啊--直接暴搜一遍即可,

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

采药 2005年NOIP全国联赛普及组&amp;疯狂的采药

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大."

[NOIP2013] 普及组

计数问题 纯模拟 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 int n,x; 6 cin>>n>>x; 7 int i,c=0; 8 for(i=1;i<=n;i++){ 9 int a=i; 10 while(a!=0){ 11 if(a%10==x)c++; 12 a/=10; 13 } 14 } 15 cout<<c;