HDU-4811
这个题绝对是近期做的最傻逼的一次…我是SB…
题意:
首先这个题目的题意我就没怎么看懂…后知后觉发现这个是说得放进去球之后的空间前后而不是时间前后…
每次往一个队中放入某种颜色的球,积分规则是:
- 第一个放入的球不得分
- 后面放入的球如果在这个队伍的一端,得分为此时队伍中不同颜色的球的数目。
- 或者也可以放在某两个球的中间,得分为新加入球的位置的左右两边的不同颜色球的数目和。
最后输出可能的得分的最大值。
题解:
其实挺好做一题,直接可以分情况讨论:
- 如果三种颜色的球都大于222,那就构造一个rybrybrybrybrybryb的序列,之后加入的球对答案的贡献就是666。
- 如果只有一种球的颜色为000,那么我们的目标就是构造一个rbrbrbrbrbrb的序列,这样之后加入的球的贡献就是444。
- 如果有两种球的数目为000,那就构造一个rrrrrr序列,这样之后的球的贡献就是222。
- 否则,出现所有球的数目都大于000但是不全大于222,那就构造一个rbybyrbybyrbyby的序列,这样之后加入的球的贡献就变成了555。
AC代码:
//This code is written by Kyrie Qi
//QQ : 601383880
//Email : cuc_qzl@cuc.edu.cn
#include <bits/stdc++.h>
#define ill __int128
#define ll long long
#define PII pair <ll,ll>
#define ull unsigned long long
#define me(a,b) memset (a,b,sizeof(a))
#define rep(i,a,b) for (int i = a;i <= b;i ++)
#define req(i,a,b) for (int i = a;i >= b;i --)
#define ios std :: ios :: sync_with_stdio(false)
const double Exp = 1e-9;
const int INF = 0x3f3f3f3f;
const int inf = -0x3f3f3f3f;
const int mode = 1000000007;
const double pi = acos(-1.0);
using namespace std;
ll col[40], ans;
inline bool cmp(ll A, ll B)
{
return A < B;
}
int main()
{
while (~scanf ("%lld%lld%lld", &col[0], &col[1], &col[2])) {
ans = 0ll;
sort (col, col + 3, cmp);
if (col[0] >= 2) {
col[0] -= 2; col[1] -= 2; col[2] -= 2;
ans += 15;
ans += 6ll * (col[0] + col[1] + col[2]);
printf ("%lld\n", ans);
}
else if (col[1] == 0) {
if (col[2] >= 2) {
ans += 1;
col[2] -= 2;
ans += 2 * col[2];
printf ("%lld\n", ans);
}
else printf ("0\n");
}
else if (col[0] == 0) {
ans += 1;
col[1] -= 1;col[2] -= 1;
if (col[1] >= 1) {
ans += 2ll;
col[1] --;
ans += 3ll;
col[2] --;
ans += 4ll * (col[1] + col[2]);
}
else {
if (col[2] >= 1) {
ans += 2ll;
col[2] --;
ans += 3ll * col[2];
}
}
printf ("%lld\n", ans);
}
else {
ans += 3ll;
col[0] -= 1;col[1] -= 1;col[2] -= 1;
if (col[1] >= 1) {
col[1] --;
ans += 3ll;
col[2] --;
ans += 4ll;
ans += 5ll * (col[2] + col[1]);
}
else {
if (col[2] >= 1) {
col[2] --;
ans += 3ll;
ans += 4ll * col[2];
}
}
printf ("%lld\n", ans);
}
}
return 0;
}