Codeforces Round #418 (Div. 2)

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值