比赛的时候不会,看题解补题的。
if a >= 2
那么1可以由一个1表示,2可以由两个1表示,这样 1 ~ 3c 范围内的所有数都能被表示,同理3c + 1 ~ 3c + 2b范围内的所有数也可以被表示,3c + 2b + 1 ~ 3c + 2b + a范围内的所有数也可以被表示。
elif a == 1
if b >= 2
那么1~3c+2b以内的所有数都能被表示,再加上上3c + 2b + 1这个数,所以答案为3c+2b+1
elif b == 1
那么1~3c以内的所有数都能被表示,再加上上3c + 1,3c + 2 ,3c + 3这三个数,所以答案为3c + 3
elif b==0
答案为2c+1
elif a == 0
if b >= 2
那么3的倍数,3的倍数 + 1(将一个3换成2个2),3的倍数 - 1(将一个3换成2)都能被表示,共3c种,再加上3c + 2 , 3c + 4 , ….. , 3c + 2b 这些数中还可以去掉一个3,但3c - 1和3c + 1 已经被出现过了,所以答案为3c + b + b - 2
elif b == 1
那么3的倍数,3的倍数 - 1(将一个3换成2)都能被表示,共2c种,再加上3c + 2这个数,所以答案为2c + 1
elif b==0
答案为c
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <vector>
#include <cstring>
#include <queue>
#define msc(X) memset(X,-1,sizeof(X))
#define ms(X) memset(X,0,sizeof(X))
typedef long long LL;
using namespace std;
int main(int argc, char const *argv[])
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>=2) printf("%lld\n",a+2ll*b+3ll*c );
else {
if(a==0){
if(b>=2){
if(c>0) printf("%lld\n",3ll*c+2ll*b-2ll );
else printf("%lld\n",(LL)b );
}
else if(b==1) printf("%lld\n",2ll*c+1ll );
else printf("%lld\n",(LL)c );
}
else{
if(b>=2){
if(c>0) printf("%lld\n",3ll*c+2ll*b+1ll );
else printf("%lld\n",2ll*b+1ll );
}
else if(b==1) printf("%lld\n",3ll*c+3ll );
else printf("%lld\n",2ll*c+1ll );
}
}
return 0;
}