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