CodeForces 412(A,B,C,D,E)

A.链接:点击打开链接

题意:给出一个长度为n的字符串和初始位置k,每次可以执行“LEFT”,“RIGHT”,“PRINT x”三种操作,问将整个字符串全部输出最少需要多少操作

代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int main(){
    int i,n,k;
    char s[10005];
    while(cin>>n>>k){
        cin>>s+1;
        if(k>n/2){                  //当离右边近时则向右走到头在向左走,反之亦然
        for(i=1;i<=n-k;i++)
        puts("RIGHT");
        for(i=n;i>=2;i--){
        printf("PRINT %c\n",s[i]);
        puts("LEFT");
        }
        printf("PRINT %c\n",s[1]);
        }
        else{
        for(i=1;i<=k-1;i++)
        puts("LEFT");
        for(i=1;i<=n-1;i++){
        printf("PRINT %c\n",s[i]);
        puts("RIGHT");
        }
        printf("PRINT %c\n",s[n]);
        }
    }
    return 0;
}

B.链接:点击打开链接 

题意:输出n个数中第k大的

代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int a[1005];
int main(){
    int n,k,i,j;
    while(cin>>n>>k){
        for(i=0;i<n;i++)
        cin>>a[i];
        sort(a,a+n,greater<int>());
        cout<<a[k-1]<<endl;
    }
    return 0;
}

C.链接:点击打开链接

题意:给出n个等长的字符串,输出符合条件的字符串(同一列如果全是?则这一位是什么都可以,如果这一列有两种并且其中一种是?则这一位是另一个字符,如果含有两种字符并且不含?或者含有多种字符则这一位是?,如果只有一种字符,则就是这个字符)

代码:

#include <set>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
char s[100005];
char temp[100005];
set<char> qu;
set<char>::iterator ite;
int main(){
    int n,i,j,len,cou_wen;
//    freopen("in.txt","r",stdin);
    while(cin>>n){
        memset(s,0,sizeof(s));
        cin>>temp;
        len=strlen(temp);
        strcat(s,temp);
        for(i=1;i<n;i++){
        cin>>temp;
        strcat(s,temp);
        }                                   //因为开不了那么大的二维数组,因此用strcat存到一个一维数组里
        memset(temp,0,sizeof(temp));
        for(j=0;j<len;j++){
            qu.clear();
            cou_wen=0;
        for(i=j;i<len*n;i+=len){
//                cout<<"<<<>>>"<<s[i]<<" ";
            if(s[i]=='?')
            cou_wen++;
            qu.insert(s[i]);
        }
        if(cou_wen==n)                      //如果一列全是?则任意赋值
        temp[j]='x';
        else if(qu.size()==2&&*qu.begin()=='?'){
        qu.erase(qu.begin());
        temp[j]=*qu.begin();                //这一列只包含两种字符,并且其中一种是?
        }
        else if(qu.size()!=1)               //包含不只一种字符
        temp[j]='?';
        else if(qu.size()==1)               //只含有一种字符
        temp[j]=*qu.begin();
        }
        cout<<temp<<endl;
    }
    return 0;
}

D.链接:点击打开链接

题意:有n个人,有m种关系(pi,qi)qi必须出现在pi前面,输出任意一种满足所有条件的可能

代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int n,m;
int s[50005],prefix[50005];
vector<int>v[50005];
void toposort(int x){
    int i,u,k,sign;
    if(prefix[x])
    return;
    prefix[x]=1;
    for(i=0;i<v[x].size();i++)
    toposort(v[x][i]);
    cout<<x<<" ";                   //dfs输出深度最大的
}
int main(){
    int i,a,b;
//    freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i=0;i<=n;i++){
            v[i].clear();
            prefix[i]=0;
        }
        for(i=0;i<m;i++){
            cin>>a>>b;
            v[a].push_back(b);
        }
        for(i=1;i<=n;i++)
        if(!prefix[i])
        toposort(i);
        printf("\n");
    }
    return 0;
}

E.链接:点击打开链接

题意:输入一个字符串,问其中可能是邮箱的字符串的数量(一个邮箱必须含有一个字符'@'和字符'.',这两个字符中间只能是由字母和数字组成的字符串并且不能为空,邮箱的开头必须是字母,'.'后面必须是由字母组成的字符串)

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[1000005];
int main(){
    long long i,j,k,x,y,ans;
    while(cin>>str+1){
        str[0]='@';
        ans=0;
        for(i=1;str[i];i++){
        x=y=0;
        if(str[i]=='@'){
            for(j=i-1;j>=0;j--){
                if(str[j]>='a'&&str[j]<='z')
                x++;
                else if(str[j]=='@'||str[j]=='.')
                break;
            }                                       //将@前面的字母数量记下来
            for(j=i+1;str[j];j++){
            if(str[j]=='.'||str[j]=='_'||str[j]=='@')
            break;                                  //中间只能由数字和字母组成不能
            }                                       //含有其他种类字符
            if(str[j]=='.'&&j!=i+1)
            for(k=j+1;str[k];k++){                  //最后只能是由字母组成的字符串
                if(str[k]<'a'||str[k]>'z')
                break;
                else
                y++;
            }
            ans+=x*y;
        }
        }
        cout<<ans<<endl;
    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值