比赛效果不错,在大佬的讲解下过了两道题,继续加油
比赛传送门 官方题解
A Playoff
简单思维
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[35];
void init()
{
dp[1] = 2;
for(int i = 2; i <= 31; i ++ ){
dp[i] = dp[i - 1] * 2;
}
}
signed main()
{
init();
int T;
cin>>T;
while(T -- ){
int n;
cin>>n;
if(n >= 2){
cout<<dp[n] - 1<<endl;
}
else if(n == 1) cout<<"1"<<endl;
}
return 0;
}
B Prove Him Wrong
也算是个思维题,刚开始没有理解题意,被1e9吓懵了,幸好在大佬指点之下拨云开雾 根据题意推出只要每个a[i]是前面的3倍(设第i个数是1,第j个数是m, 2(m-1)=m+1,得出m=3,推下一个可以用3替代1,依次向后推出后一个数是前一个数的三倍就可以让序列之和永远递增),那么这个数列的和无论怎么变化一定是增大的,然后判断3的几次方大于1e9,19次方,所以当n>=20(因为第一项是1)时就无法满足每个数都是前面的三倍,可能就不是反例了
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[23];
void init(){
dp[1] = 1;
for(int i = 2; i <= 22; i ++ ){
dp[i] = dp[i - 1] * 3;
}
}
signed main()
{
init();
int T;
cin>>T;
while(T -- ){
int n;
cin>>n;
if(n >= 20){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
for(int i = 1; i <= n; i ++ ){
cout<<dp[i]<<" ";
}
}
cout<<endl;
}
return 0;
}
|