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个样例,是真的骚,不过最骚的还是自己脑子抽了题写错了还写解题思路写的贼起劲,我果然是个脑残。。。。

原文地址:https://www.cnblogs.com/kls123/p/7193833.html