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’的字符并且字符不等。就这样模拟就行啦。
能力有限,卡在了D,还是没看明白……。后面的题目也就没看了。
继续加油。
题目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,还是没看明白……。后面的题目也就没看了。
继续加油。
相关文章推荐
- Atcoder CODE FESTIVAL 2017 qual C 总结+ABCD题解
- [Atcoder CODE FESTIVAL 2017 qual C]D - Yet Another Palindrome Partitioning 状压DP
- 【AtCoder CODE FESTIVAL 2017 qual C】D - Yet Another Palindrome Partitioning (状压dp 字符串)
- 【二分图染色】AtCoder CODE FESTIVAL 2017(qual B)C[3 Steps]题解
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
- atcoder CODE FESTIVAL 2017 qual A 手速(雾)赛
- Code Festival 2017 qualA E-Modern Painting
- Code Festival 2017 qualA D Four Coloring[构造]
- Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations
- CODE FESTIVAL 2017 qual B:C - 3 Steps 并查集判二分图、二分图性质
- [DP]Atcoder CODE FESTIVAL 2017 Final (Parallel) D - Zabuton
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
- B - Palindrome-phobia(CODE FESTIVAL 2017 Final)
- Atcoder CODE FESTIVAL 2017 Final 简要题解
- CODE FESTIVAL 2017 qual A C
- 找规律 B - Palindrome-phobia(CODE FESTIVAL 2017 Final)
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
- 出现( linker command failed with exit code 1)错误总结
- leecode 解题总结:116. Populating Next Right Pointers in Each Node
- Codeforces Round #102 (Div. 2)总结(如何处理A*B*C==n!!!)