题目描述:
传送门
题目大意:
一个人拥有三种球,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);
}
}