2021-10-16

HDU-4811

这个题绝对是近期做的最傻逼的一次…我是SB…
题意:
首先这个题目的题意我就没怎么看懂…后知后觉发现这个是说得放进去球之后的空间前后而不是时间前后…
每次往一个队中放入某种颜色的球,积分规则是:

  1. 第一个放入的球不得分
  2. 后面放入的球如果在这个队伍的一端,得分为此时队伍中不同颜色的球的数目。
  3. 或者也可以放在某两个球的中间,得分为新加入球的位置的左右两边的不同颜色球的数目和。

最后输出可能的得分的最大值。

题解:
其实挺好做一题,直接可以分情况讨论:

  1. 如果三种颜色的球都大于222,那就构造一个rybrybrybrybrybryb的序列,之后加入的球对答案的贡献就是666
  2. 如果只有一种球的颜色为000,那么我们的目标就是构造一个rbrbrbrbrbrb的序列,这样之后加入的球的贡献就是444
  3. 如果有两种球的数目为000,那就构造一个rrrrrr序列,这样之后的球的贡献就是222
  4. 否则,出现所有球的数目都大于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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CUCKyrie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值