您的位置:首页 > 其它

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

2015-11-29 18:35 225 查看
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
);
}
}
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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: