HDu4811&&郑轻新生资格赛最后一题思维题

题目描述:
在这里插入图片描述
传送门

题目大意:
一个人拥有三种球,R、Y、B、他可以将球放在桌面上从而得分,有两种1.得分方式:
1.他可以选择在一排球一段放置,那么他的这次得分是前面球不同颜色数
2.他可以选择在一排球中间放置,那么他的这次得分是左右不同颜色球数之和
两种方式都除了它自己本身以外,
思路:
你可以自己在演草纸上试一下,他会有一个最大的放法,假如三种种类的球都超过2个那么我可以按
RYBRYB放置及两边都能放三个以后再放球的话最大就是6了。比如RYBRRYB 而如果有某种个数不超过2个他就只能放在一边,所以我们只需要计算最大的情况放多少,如果某种种类超过两个贡献就是2,及R…R这点很关键,因为达到最大后再放置球就一样了,后面的直接相乘计算就行了,而前面的放置可以用等差数列计算比如
第一次放R 0
第二次方RY 1
第三次RYB 2
第四次RYBR 3
第五次 RYBBR4
第六次RYBYBR 5
所以可以按等差数列计算:

代码:

/*
Keep clam  Believe youself
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<cmath>
#define Xiaobo main
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f;
typedef long long ll;
ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}
int del(int x) {
	return x>2?2:x;
}
int Xiaobo()
{
	 int t,a,b,c;
//	 scanf("%d",&t);
	 while(~scanf("%d%d%d",&a,&b,&c)) {
	 	ll ind=del(a)+del(b)+del(c);
	 	ll sum=(a+b+c-ind)*ind+(ind-1)*ind/2;
	 	printf("%lld\n",sum); 
	 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值