[CodeForces]1263A Sweet Problem
题目描述
You have three piles of candies: red, green and blue candies:
the first pile contains only red candies and there are rrr candies in it,
the second pile contains only green candies and there are ggg candies in it,
the third pile contains only blue candies and there are bbb candies in it.
Each day Tanya eats exactly two candies of different colors. She is free to choose the colors of eaten candies: the only restriction that she can’t eat two candies of the same color in a day.
Find the maximal number of days Tanya can eat candies? Each day she needs to eat exactly two candies.
输入
The first line contains integer t(1≤t≤1000)t (1≤t≤1000)t(1≤t≤1000) — the number of test cases in the input.
Then ttt test cases follow.
Each test case is given as a separate line of the input. It contains three integers rrr, ggg and b(1≤r,g,b≤108)b(1≤r,g,b≤10^8)b(1≤r,g,b≤108) — the number of red, green and blue candies, respectively.
输出
Print ttt integers: the iii-th printed integer is the answer on the iii-th test case in the input.
题目大意
给定ttt组测试数据。
每组数据包含r,g,br,g,br,g,b三个数,代表3种糖的数量。
每天只能吃不同的两种糖,两种各吃一颗。
求最多能吃多少天。
解法
容易发现哪种颜色都没有关系,因此直接假定:
r>g>br>g>br>g>b
那么怎么吃最优呢?最优吃法应当是固定的。我考虑计算r与gr与gr与g的差值。
设delta=r−gdelta = r - gdelta=r−g,
那么若delta>=bdelta >= bdelta>=b,即把b和r一起吃完b后,只剩下r−b,gr-b,gr−b,g,此时r−b>=gr-b>=gr−b>=g,那么再一起吃ggg天即可。
此时ans=b+gans = b + gans=b+g。
若delta<bdelta < bdelta<b,那么我们把rrr和bbb一起吃,吃deltadeltadelta天,使得rrr吃完后与ggg相等。
随后均分剩余的bbb给另外两堆,每堆吃(b−delta)/2(b-delta)/2(b−delta)/2天。这里向下取整,如果多了一颗糖不能凑成一对,对结果没有影响。
随后吃g−(b−delta)/2g-(b-delta)/2g−(b−delta)/2天即可把剩下两堆一起吃完。
若(b−delta)/2(b-delta)/2(b−delta)/2为奇数,那么最后会剩下一颗糖,否则全部吃完。
统计答案,ans=delta+(b−delta)+g−(b−delta)/2ans = delta + (b-delta) + g-(b-delta)/2ans=delta+(b−delta)+g−(b−delta)/2
即ans=r−g+b−r+g+g−b/2+r/2−g/2ans = r - g + b - r + g + g - b/2 + r/2 - g/2ans=r−g+b−r+g+g−b/2+r/2−g/2
整理得ans=(r+g+b)/2ans = (r+g+b)/2ans=(r+g+b)/2
除以二向下取整,那么奇偶的影响就被消除了。可以手推几组感受一下。
Code
#include <cstdio>
#include <algorithm>
using namespace std;
int all[4];
int ans, t;
int main()
{
scanf("%d", &t);
while (t--)
{
ans = 0;
for (int i = 1; i <= 3; ++i)
scanf("%d", all + i);
sort(all + 1, all + 4);
int delta = all[3] - all[2];
if (delta >= all[1])
printf("%d\n", all[1] + all[2]);
else
printf("%d\n",(all[1] + all[2] + all[3])>>1);
}
return 0;
}
[CodeForces]1263A Sweet Problem的更多相关文章
- Codeforces Round #603 (Div. 2) A. Sweet Problem(水.......没做出来)+C题
Codeforces Round #603 (Div. 2) A. Sweet Problem A. Sweet Problem time limit per test 1 second memory ...
- Codeforces Round #603 (Div. 2) A. Sweet Problem 水题
A. Sweet Problem the first pile contains only red candies and there are r candies in it, the second ...
- codeforces 340C Tourist Problem
link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...
- codeforces B. Routine Problem 解题报告
题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...
- Codeforces 527D Clique Problem
http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...
- Codeforces 706C - Hard problem - [DP]
题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...
- Codeforces 1096D - Easy Problem - [DP]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...
- Codeforces 793C - Mice problem(几何)
题目链接:http://codeforces.com/problemset/problem/793/C 题目大意:给你一个捕鼠器坐标,和各个老鼠的的坐标以及相应坐标的移动速度,问你是否存在一个时间点可 ...
- CodeForces 687A NP-Hard Problem
Portal:http://codeforces.com/problemset/problem/687/A 二分图染色 好模板题 有SPJ 值得注意的是,因为C++的奇妙的运算机制 若在vector变 ...
随机推荐
- MRCP接口MRCPRecog 简介
功能:开始一个语音识别,一边讲话,一边识别,需要ASR服务器. 原型:MRCPRecog (grammar, options) grammar ---- 语法文件,可以是一个xml文件 options ...
- UITextField的快速基本使用代码块
概述 UITextField在界面中显示可编辑文本区域的对象. 您可以使用文本字段来使用屏幕键盘从用户收集基于文本的输入.键盘可以配置许多不同类型的输入,如纯文本,电子邮件,数字等等.文本字段使用目标 ...
- Pytorch本人疑问(2)model.train()和model.eval()的区别
我们在训练时如果使用了BN层和Dropout层,我们需要对model进行标识: model.train():在训练时使用BN层和Dropout层,对模型进行更改. model.eval():在评价时将 ...
- OBST(最优二叉搜索树)
简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些 ...
- Codeforces 1304D. Shortest and Longest LIS
根据题目,我们可以找最短的LIS和最长的LIS,找最短LIS时,可以将每一个increase序列分成一组,从左到右将最大的还未选择的数字填写进去,不同组之间一定不会存在s[i]<s[j]的情况, ...
- redis 之redis-sentinel主从复制高可用
一.redis主从复制背景问题 Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用: (1)一旦主节点宕机,从节点作为主节点的备份可以随时顶上来. (2)扩展主节点的读能力,分担主节点 ...
- 记录—JPA生成数据库表
环境 springBoot+JPA+MySQL application-dev.yml 注意:配置中的blog数据库需要先创建,否则启动springBoot会报错 spring: #数据库连接配置 d ...
- Hbase 永久 Region-In-Transition 的查错记录
状态:部分 region 的状态为 FAILED_CLOSE,且一直停留在 RIT,不可服务. 1. 首先,到 hbase region 上查日志(/var/log/hbase/),看到是 hdfs ...
- VS2010如何进行程序调试
VS2010如何进行程序调试 一.前言 对于初步学习C++的朋友,程序的调试是一项必备的技能.尤其是像C++这样难学的语言,程序调试的基本方法更是至关重要.毕竟,谁也不想自己幸幸苦苦一天敲出来的代码就 ...
- C++ 结构体指针理解
上一篇基础链接https://www.cnblogs.com/xuexidememeda/p/12283845.html 主要说一下链表里面双重指针 先说一下结构体 typedef struct LN ...