Codeforces Round #418 (Div. 2)

来源:互联网 发布:我的淘宝没有我要开店 编辑:程序博客网 时间:2024/06/05 07:25

A、水

B、输给英语:permutation是排列的意思,也就是所有数字只能够出现一次。

给2个序列列,这两个序列不完全相同,也就是存在不同的位置,要求找到第3个排列,使得其与第一序列和第二序列exactly一个不同。

显然第一个序列和第二个序列不同的值不超过2个,那么特判全部情况,然后第三个排列输出的时候注意判重即可。

C、

可以预处理出各个字母如果添加n个的时候,最多连续能到多少。

!!!!!如果觉得对的思想,不要尝试一下就想着放弃,因为可能自己代码写错(即便自己认为正确的想法也不一定一发可以ac,更不用说不一定正确的,不是吗)

D、

暴力,给n个圆,两两圆不相交2个交点,存在包含和分离2个不同位置的情况,可以以r从大到小排序,那么这些圆哪个在后面的位置也就可知了。

那么可以这么贪心,从后面的圆开始判断这个圆放在哪个位置会使得sum最大,如果两个圆的sum相同,显然这个圆放在两个地方的结果都一样,因为后期的圆放哪都一样。

#include <stdio.h>#include<algorithm>#include <math.h>#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int MOD=1e4+7;const double PI=3.1415926535897932;struct ttt{double x,y,r;};ttt qq[1050];int cmp1(ttt a,ttt b){    return a.r>b.r; //r��ķ���ǰ��}int q1[1050];int q2[1050];double fun1(ttt a,ttt b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int i,j,k,l,f1,f2,f3,t1,t2,t3;    int r,c,m;    int a1,b1,c1;    int T,n;    cin >>n;    for(i=1;i<=n;i++){        cin >> qq[i].x >> qq[i].y>> qq[i].r;    }    sort(qq+1,qq+1+n,cmp1);    /*for(i=1;i<=n;i++){        cout <<i <<"    " << qq[i].x <<"  "<<qq[i].y <<"  "<<qq[i].r << endl;    }*/    f1=0;f2=0;    double sum1=0,sum2=0;    for(i=1;i<=n;i++){        t1=0;t2=0;        for(j=1;j<=f1;j++){        if(fun1(qq[q1[j]],qq[i])<qq[q1[j]].r+qq[i].r){            t1++;        }        }        for(j=1;j<=f2;j++){        if(fun1(qq[q2[j]],qq[i])<qq[q2[j]].r+qq[i].r){            t2++;        }        }        if(t1%2==0){ //���������            q1[++f1]=i; //这个f1中存的是i这个下标        }else if(t2%2==0){            q2[++f2]=i;        }else{            q1[++f1]=i;        }    }    for(i=1;i<=f1;i++){        t1=0;        for(j=1;j<i;j++){            if(fun1(qq[q1[i]],qq[q1[j]])<qq[q1[i]].r+qq[q1[j]].r){                t1++;            }        }        if(t1%2==0){ //ǰ��ż�������Ϊ����        sum1+=PI*qq[q1[i]].r*qq[q1[i]].r;        }else{        sum1-=PI*qq[q1[i]].r*qq[q1[i]].r;        }    }    for(i=1;i<=f2;i++){        t1=0;        for(j=1;j<i;j++){            if(fun1(qq[q2[i]],qq[q2[j]])<qq[q2[i]].r+qq[q2[j]].r){                t1++;            }        }        if(t1%2==0){ //ǰ��ż�������Ϊ����        sum1+=PI*qq[q2[i]].r*qq[q2[i]].r;        }else{        sum1-=PI*qq[q2[i]].r*qq[q2[i]].r;        }    }    printf("%.9f\n",sum1+sum2);    //cout << sum1+sum2 <<endl;    return 0;}