Educational Codeforces Round 25 A,B,C,D
A:链接:http://codeforces.com/contest/825/problem/A
解题思路:
一开始以为是个进制转换后面发现是我想多了,就是统计有多少个1然后碰到0输出就行,没看清题意。。
实现代码:
#include<bits/stdc++.h> using namespace std; int main() { int m,i,ans=0; string s; cin>>m; cin>>s; for(i=0;i<m;i++){ if(s[i]=='1') ans++; if(s[i]=='0'||i==m-1){ cout<<ans; ans=0;} } if(s[m-1]=='0') cout<<"0"; cout<<endl; return 0; }
B.Five-In-a-Row
链接:http://codeforces.com/contest/825/problem/B
解题思路:
就是五子棋,问你能否在空白处填充一个x使其成五子,把字符转换为数字,如果要只差一步成五子,只能是四个‘x’和一个‘.’分别赋值,然后暴力遍历就可以了;
实现代码:
#include<bits/stdc++.h> using namespace std; char mp[12][12]; int id[12][12]; int main() { int i,j,k,ans1,ans2,ans3,ans4,ans,ans5; memset(id,0,sizeof(id)); for(i=1;i<=10;i++){ for(j=1;j<=10;j++){ cin>>mp[i][j]; if(mp[i][j]=='X') id[i][j] = 1; if(mp[i][j]=='O') id[i][j] = -1; if(mp[i][j]=='.') id[i][j] = 0; } } for(i=1;i<=10;i++){ for(j=1;j<=10;j++){ if(id[i][j]==1||id[i][j]==0){ ans1 = 0;ans2=0;ans3=0;ans4=0,ans5=0; for(k=0;k<5;k++){ if(j<=6) ans1+=id[i][j+k]; if(i<=6) ans2+=id[i+k][j]; if(j<=6&&i<=6) ans3+=id[i+k][j+k]; if(i>=5&&j>=5) ans4+=id[i-k][j-k]; if(i>=5&&j<=6) ans5+=id[i-k][j+k]; } ans = max(ans1,max(ans2,max(ans3,max(ans4,ans5)))); //cout<<ans<<endl; if(ans==4){ cout<<"YES"<<endl; return 0; } } } } cout<<"NO"<<endl; return 0; }
C:链接:http://codeforces.com/contest/825/problem/C
解题思路:
题目意思有些难懂,要求解决困难,已经解决了k难度的问题,如果待解决的问题ai小于k*2的话可以直接解决,反之需要先达到ai/2,也就是将k不断翻倍直到k*2>=ai.才能解决该问题。而此时已经解决的最大难度为max(k,ai).不断推就行了。看懂题了就很简单了。
实现代码:
#include<bits/stdc++.h> using namespace std; int main() { int n,k,i,maxx = -99999999,a[1009],ans=0; cin>>n>>k; for(i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); for(i=0;i<n;i++){ cout<<k<<" "<<a[i]<<endl; while(k*2<a[i]){ k*=2; ans++; } k = max(a[i],k); } cout<<ans<<endl; return 0; }
D.Suitable Replacement
链接:http://codeforces.com/contest/825/problem/D
解题思路:
题目要通过改变?号来求出最大适合性的字符串,那么可以先将'?'的下标存进vector数组里,然后用map记录下确定的值;要使两个字符串最匹配,直接遍历第二个字符串如果其中有和第一个字符串相同的字符,map数组减一下,如果没有相同的,为使匹配度最大直接将'?'改成当前字符就行了。
实现代码:
#include<bits/stdc++.h> using namespace std; map<char,int>mp; vector<int>v; int main() { ios::sync_with_stdio(false); cin.tie(0); string s1,s2; int i; cin>>s1; cin>>s2; for(i=0;i<s1.size();i++){ if(s1[i]=='?') v.push_back(i); else mp[s1[i]]++; } while(!v.empty()){ for(i=0;i<s2.size();i++){ if(mp[s2[i]]) mp[s2[i]]--; else{ s1[v.back()] = s2[i]; //cout<<s2[i]<<endl; v.pop_back(); if(v.empty()) break; } } } cout<<s1<<endl; return 0; }
ps: D还在等判题,突然被室友拉去打了把lol,打完感觉自己忘了什么,然后没多想直接写题解。。贴代码。。欣赏了一下,打开cf发现re了,发现应该是忘了加个break操作访问越界了,加完过了那组数据然后疯狂wa一组大的数据过不去,心态爆炸,找了一个小时的错误,最后发现把vector数组的数据定义错了,明明是int型,偏偏打成了char型,就这样还过了6个样例,是真的骚,不过最骚的还是自己脑子抽了题写错了还写解题思路写的贼起劲,我果然是个脑残。。。。