您的位置:首页 > Web前端

CODE FESTIVAL 2017 qual C- A-B-C 总结

2017-10-24 22:26 381 查看
题目链接:点击打开链接

题目A,B,C;

比赛当时只做出了三道题,下来之后想补D题,但是想了很久都不明白。唉

题目A: 签到

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;

int main(){
string s;
string t="AC";
cin>>s;
if(s.find(t)!=-1) printf("Yes\n");
else printf("No\n");
return 0;
}

题目B:暴力

我的想法是,先考虑两个数a,b的情况。

如果a是奇数,那么相邻的两个数就是偶数,同理,如果a是偶数,那么相邻的两个数就是奇数。

只有奇数*奇数=奇数。剩下三种情况相乘之后都是偶数。

比如样例1:2,3

那么就是 2odd+1even   2even+1odd  相乘之后奇数的个数 odd=2*1=2   even=3*3-odd=7;

如果n=3,那么先把前两个算出来,比如 n=3: 2 3 3;前两个数算完之后就 是 odd=2 even=7     在和后面的3  2even+1odd 计算即可,这样推下去就行。暴力,记得开long long 

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int c[27][27]={0};
void play_table(void)
{
for(int i=0;i<=26;i++)
for(int j=0;j<=i;j++)
if(!j || i==j)
c[i][j]=1;
else
c[i][j]=c[i-1][j-1]+c[i-1][j];
c[0][0]=0;
return;
}
bool f[15];
int e[15],o[15];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(x&1) f[i]=true;//odd 1
else f[i]=false;// even 0
if(f[i]){
e[i]=2;
o[i]=1;
}else{
e[i]=1;
o[i]=2;
}
}
int ans;
int even=0,odd=0;
/*
cure=e[1]*e[2]+e[1]*o[2]+o[1]*e[2];
curo=(e[1]+o[1])*(e[2]+o[2])-cure;
*/
odd=o[1]*o[2];
even=(o[1]+e[1])*(o[2]+e[2])-odd;

//printf("cure=%d,curo=%d\n",cure,curo);
for(int i=2;i<n;i++){
int tmp=odd;
odd=odd*o[i+1];
even=(tmp+even)*(o[i+1]+e[i+1])-odd;
/*
cure=cure*e[i+1]+curo*e[i+1]+cure*o[i+1];
curo=(cure+curo)*(e[i+1]+o[i+1])-cure;
printf("cure=%d,curo=%d\n",cure,curo);
*/

}
if(n==1){
if(f[1]) printf("0\n");
else printf("1\n");
}else{
printf("%d\n",even);

}

return 0;
}

C题:模拟一下。

首先考虑把所有的X去掉,如果剩下的串是不是回文串,那么不论怎么往字符串里面增加X都不可能凑成回文串。

当去掉X之后的串是回文串之后,我们再处理。

设置两个指针,head tail 头指针与尾指针

如果扫到的两个字符都是X 那么head+1 tail-1 

如果扫到的两个字符只有一个是X 另外一个不是X 比如 xaxba  下标从0-4 head=0 tail=4  s[head]='X' s[tail]='a'  我们应该在tail 后面加一个X,变成 xaxbax 对吧,那么我们模拟这个过程,head+1 ,tail不动,ans+1;

不存在扫到两个不为‘X’的字符并且字符不等。就这样模拟就行啦。

#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int main(){
string s,t;
cin>>s;
t=s;
for(int i=s.length()-1;i>=0;i--){
if(s[i]=='x'){
t.erase(t.begin()+i);
}
}
//cout<<t<<endl;
bool p=true;
int len=t.length();
for(int i=0;i<=(len/2);i++){
if(t[i]!=t[len-1-i]){
p=false;
break;
}
}
if(!p) printf("-1\n");
else{
int ans=0;
int head=0,tail=s.length()-1;
for(int i=0;i<s.length();i++){
if(tail<=head) break;
if(s[head]!=s[tail]){
if(s[head]=='x'){
head++;
ans++;
}else if(s[tail]=='x'){
tail--;
ans++;
}
}else if(s[head]==s[tail]){
tail--;
head++;
}
}
printf("%d\n",ans);
}

return 0;
}


能力有限,卡在了D,还是没看明白……。后面的题目也就没看了。
继续加油。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: