A. Prime Minister
题意:给n个数,第一个数是初始值,如果后面n-1个数满足ai<=a1/2,那么第i个就加入这个团队,到最后,如果这个团队总数没有严格大于原来n个数和的一半,就无解,否则就输出团队内的位置;(***当时看着那么一大堆的英文就头晕....)
#include <bits/stdc++.h> using namespace std; const int maxn=1e3+10; int main() { ios::sync_with_stdio(false); int n; int a[maxn]; cin>>n; int sum=0; for(int i=1;i<=n;i++){ cin>>a[i]; sum+=a[i]; } int tot=a[1],cnt=1; bool vis[maxn]; memset(vis,0,sizeof(vis)); vis[1]=true; for(int i=2;i<=n;i++){ if(a[i]<=a[1]/2) tot+=a[i],vis[i]=true,cnt++; } if(tot>sum/2){ cout<<cnt<<endl; for(int i=1;i<=n;i++) if(vis[i])cout<<i<<' '; cout<<endl; } else cout<<0<<endl; return 0; }
B. WOW Factor
题意:给你一个字符串,输出构成WOW的所有可能和,两个连续的V构成一个W;
思路:记录两个连续v的个数,便利一遍字符串,遇到o的话就计算,当前o构成wow的所有可能为o前面w的个数*o后面w的个数
#include <bits/stdc++.h> using namespace std; const int maxn=2e5+100; typedef long long ll; int main() { ios_base::sync_with_stdio(false); string s; cin>>s; ll cnt=0; for(int i=0;i<s.size();i++) { if(s[i]=='v'&&s[i+1]=='v') cnt++; } ll ans=0,cntv=0; for(int i=0;i<s.size();i++) { if(s[i]=='o') { ans+=cntv*(cnt-cntv); } else if(s[i]=='v'&&s[i+1]=='v') { cntv++; } } cout<<ans<<endl; return 0; }
C. Tiles
题意:给你一块砖,你可以旋转他,可以将黑白色对调,要求相邻砖块颜色不同;
思考:当一块砖的颜色确定,其他砖的颜色是不是全部确定,其他砖就只有旋转才能改变,每个位置都有两种可能(包括第一块也是只能旋转,不用考虑颜色)
求出所有格数,2^格数就是答案
#include <bits/stdc++.h> using namespace std; const int maxn=2e5+100; const int mo=998244353; typedef long long ll; int main() { ios_base::sync_with_stdio(false); int n,m; cin>>n>>m; ll ans=1; for(int i=0;i<n+m;i++) { ans*=2; ans%=mo; } cout<<ans<<endl; return 0; }
D. Prime Graph
题意:给n个点,连线,要求每个点的度为素数,要求边的总数要为素数;
思考:打表发现,两个相邻素数之差不会超过前一个素数的一半,所以只要每个点顺连成环,这样保证每个点的度都为素数,然后在环内连接,连接到离n最近的一个素数就行了;
#include <bits/stdc++.h> using namespace std; const int maxn=1100; const int mo=998244353; typedef long long ll; int a[maxn*maxn]={1,1,0}; int n; void isPrime() { for(int i=2;i<maxn*maxn;i++) if(!a[i]) for(int j=i+i;j<maxn*maxn;j+=i) a[j]=1; } int main() { ios_base::sync_with_stdio(false); cin>>n; isPrime(); int flag=0; for(int i=n;;i++){ if(a[i]==0){ flag=i; break; } } cout<<flag<<endl; for(int i=1;i<n;i++) cout<<i<<' '<<i+1<<endl; cout<<n<<' '<<1<<endl; flag-=n; while(flag){ for(int i=1;i<=n;){ if(flag==0)break; cout<<i<<' '<<i+2<<endl; if(i&1)i++; else i+=3; flag--; } } return 0; }
E. Archaeology
题意:给一个字符串,输出最长回文串;
思路:从字符串两边找,一样的话就存起来,不一样的话继续找,详细看代码;
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; int main() { ios::sync_with_stdio(false); string s; cin>>s; char a[maxn],b[maxn]; int flag=0; int left=0,right=s.size()-1; int k=0; while(left<=right){ if(s[left]==s[right]){ if(left==right) a[k]=s[left],flag=1; else a[k]=s[left],b[k++]=s[right]; left++,right--; } else{ if(left+1==right){ a[k]=s[left],flag=1; left++,right--; } else if(s[left]==s[right-1]){ a[k]=s[left],b[k++]=s[right-1]; left++,right-=2; } else if(s[left+1]==s[right]){ a[k]=s[left+1],b[k++]=s[right]; left+=2,right--; } else left++,right--; } } for(int i=0;i<k+flag;i++) cout<<a[i]; for(int i=k-1;i>=0;i--) cout<<b[i]; cout<<endl; return 0; }