2017 Qinhuangdao Site CCPC E&&M

E - String of CCPC ZOJ - 3985

传送门:https://cn.vjudge.net/contest/227061#problem/E

题意:

给出字符串,判断CCPC的个数以及判断是否添一个数能够构成CCPC.
(由原题得出 最多只能得一分 不然就是负分 画个坐标轴很好想)

分析:

CCPC这个是直接可以的分的 CCP CPC CCC是可以得一分的,这里的关键问题是解决CCPC和其子序列的公用字母问题。可以想到的是在CCPC中P是唯一的所有如果CCPC,我们直接i+=2,跳过了CCP CPC。再特判一下CCC出现是否会构成CCPC.. 就好啦

emmmm 注意大小写!

#include<bits/stdc++.h>
using namespace std;
string ccpc="CCPC";
string cpc="CPC";
string ccp="CCP";
string ccc="CCC";
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        string s;
        cin>>s;
        int cnt=0;
        bool flag=0;
        for(int i=0; i<n; i++)
        {
            if(s.substr(i,4)==ccpc)
            {
                cnt++;
                i+=2;
                continue;
            }
            if(flag) continue;
            string tmp = s.substr(i,3);
            if(tmp==ccp||tmp==cpc||tmp==ccc)
            {
                if(tmp==ccc &&s.substr(i+1, 4)==ccpc)
                    continue;
                cnt++;
                flag = 1;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

M - Safest Buildings ZOJ - 3993

传送门:https://cn.vjudge.net/contest/227061#problem/M

题意:

有圆心为(0,0) 半径为R的安全区域,会缩小为半径为r的安全区(始终包含或相切在原来圆中) 有n个房子,概率最大的安全的房子有几个并输出编号。

分析:

1.R<=2r时候 存在必然安全圈
2.R>2r 存在等价安全圈
3.[|R-2r|,R],概率会不断的减小

平方处理的话不需要分类讨论了
我的代码 本来写了一些不需要的东西 看了队友代码意识到自己的代码可以再精简一点

#include <bits/stdc++.h>
using namespace std;
const int maxn=11111;
int d[maxn];
double dist[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,dd,tt;
        cin>>n;
        int R,r;
        cin>>R>>r;
        dd=R-2*r;
        tt=-1;
        int cnt=0;
        int x,y;
        for(int i=1; i<=n; i++)
        {
            cin>>x>>y;
            dist[i]=x*x+y*y;
            if(dist[i]<=dd*dd)
                d[cnt++]=i;
            if(tt==-1||dist[i]<=tt)
                tt=dist[i];
        }
        if(cnt==0)
        {
            for(int i=1; i<=n; i++)
                if(dist[i]==tt)
                    d[cnt++]=i;
        }

        cout<<cnt<<endl;
        for(int i=0; i<cnt; i++)
        {
            if(i==cnt-1) cout<<d[i]<<endl;
            else cout<<d[i]<<' ';
        }
    }
    return 0;
}


队友的代码
虽然略有繁琐
...
但是upper_bound是真的好用

#include <bits/stdc++.h>
using namespace std;

const int maxn = 11111;
struct bd{
    int dis;
    int id;
    bool operator < (const bd & bd1) const{
        return dis < bd1.dis;
    }
}a[maxn];

bool cmp(bd bd1, bd bd2){
    return bd1.id < bd2.id;
}

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        int n;
        scanf("%d", &n);
        int R, r;
        scanf("%d %d", &R, &r);
        int dd = R - 2 * r;
        for(int i = 1; i <= n; ++i) {
            int x, y;
            scanf("%d %d", &x, &y);
            a[i].dis = (x * x + y * y);
            a[i].id = i;
        }
        bd tmp;
        tmp.dis = dd * dd;
//        printf("%d\n", tmp.dis);
        sort(a + 1, a + 1 + n);
//        for(int i = 1; i <= n; i++){
//            printf("%d %d\n", a[i].id, a[i].dis);
//        }
        int pos = upper_bound(a + 1, a + 1 + n, tmp) - a - 1;
        tmp.dis = a[1].dis;
        if(pos == 0)
            pos = upper_bound(a + 1, a + 1 + n, tmp) - a - 1;
        printf("%d\n", pos);
        sort(a + 1, a + 1 + pos, cmp);
        for(int i = 1; i <= pos; i++) {
            if(i != 1)
                printf(" %d", a[i].id);
            else
                printf("%d", a[i].id);
        }
        putchar('\n');
    }
    return 0;
}
posted @ 2018-05-06 09:51  muvseea  阅读(232)  评论(0编辑  收藏  举报