Codeforces Good Bye 2017

A. 模拟即可。

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str;int cnt=0;
    cin>>str;
    for(auto a:str){
        if(a=='a'||a=='i'||a=='o'||a=='e'||a=='u'||a=='1'||a=='3'||a=='5'||a=='7'||a=='9')
            cnt++;
    }
    cout<<cnt<<endl;

    return 0;
}

B. 暴力枚举24种映射的情况即可….题目很简单,但是不是很好写

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef pair<int,int>P;
vector<int>per;
void rotate(P*a,P*b)
{
    for(int i=0;i<4;i++)
        a[i]=b[per[i]];
}
int main()
{
    P mps[4]={ {0,1},{-1,0},{0,-1},{1,0}},mp[4];
    int n,m,i,j,k;
    cin>>n>>m;
    string str;
    for(i=0;i<4;i++)per.push_back(i);
    char mp1[55][55];
    int x,y;
    for(i=1;i<=n;i++){
        cin>>mp1[i]+1;
        for(j=1;j<=m;j++){
            if(mp1[i][j]=='S'){
                x=j,y=i;break;
            }
        }
    }
    cin>>str;int ans=0;
    for(int r=1;r<=24;r++){
        if(r>1)next_permutation(per.begin(),per.end());
        rotate(mp,mps);
        int x1=x,y1=y;
        for(auto a:str){
            int p=a-'0';
            x1+=mp[p].first;y1+=mp[p].second;
            if(x1<1||x1>m||y1<1||y1>n||mp1[y1][x1]=='#')break;
            if(mp1[y1][x1]=='E'){
                ans++;break;
            }
        }
    }

    cout<<ans<<endl;

    return 0;
}

C. 本来想着对于每个新加入的圆找出所有可能跟他冲突的圆进行计算的,但是边界不太好把握…后来发现这个数据范围…直接暴力枚举之前加入的所有圆与这圆冲突的可能即可…

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,r,x[1005]={0},t,i,j;double y[1005]={0};
    scanf("%d%d",&n,&r);
    for(i=1;i<=n;i++){
        scanf("%d",&x[i]);y[i]=r;
        for(j=1;j<i;j++) {
            t = x[i] - x[j], y[i] = max(y[i], y[j] + sqrt(4 * r * r - t * t));
        }
        printf("%.10f ",y[i]);
    }

    return 0;
}

F. 我们可以用绿色的点把整个线段分开,那么对于每一个区间(两端是绿色的点),有两种选择:1.两个绿色的点不连接,那么就需要把里面所有的红色点蓝色点都连接起来,长度是2 区间长度 2.连接绿色点,那么长度就是区间长度 3-长度最长的连接红点的边-长度最长的连接蓝点的边

#include<cstdio>
#include<algorithm>
using namespace std;
int n,x,pr,pb,pg,mr,mb,ans=0;
char s[10];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%s",&x,s);
        if(s[0]=='R'||s[0]=='G'){
            if(pr){
                ans+=x-pr;
                mr=max(mr,x-pr);
            }
            pr=x;
        }
        if(s[0]=='B'||s[0]=='G'){
            if(pb){
                ans+=x-pb;
                mb=max(mb,x-pb);
            }
            pb=x;
        }
        if(s[0]=='G'){
            if(pg)ans+=min(0,x-pg-mr-mb);
            pg=x;mr=0;mb=0;
        }
    }
    printf("%d",ans);
    return 0;
}