Codeforces Global Round 4

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;
}
View Code

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;
}
View Code

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;
}
View Code

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;
}
View Code

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;
}
View Code

 

转载于:https://www.cnblogs.com/lin1874/p/11220639.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值