hoj 13781 Wedding Selfie
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <limits.h>
#include <string.h>
#include <vector>
#include <map>
#include <math.h>
#define LL unsigned long long
#define INF 2100000000
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define eps 5e-7
using namespace std;
const int maxn=(int)1e2 +30;
const int MOD=(int)1e9+10;
const double PI=acos(-1.0) ;
int sgn(double x){return (x>eps)-(x<-eps);}
template<class T>inline void MAX(T &a,T b){if(a<b)a=b;}
template<class T>inline void MIN(T &a,T b){if(a>b)a=b;}
struct point {
double x,y;
point(){}
point(double x,double y):x(x),y(y){}
void input(){scanf("%lf%lf",&x,&y);}
void output(){printf("%.6lf %.6lf\n",(sgn(x)==0)? 0.0:x,(sgn(y)==0)? 0.0:y); }
point rotate(double a){return point(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a));}
//应创立新的点而不是在原有点上更改****important
};
point p[maxn];
double area(point &a,point &b,point &c){
return fabs(0.5*(a.x*b.y+a.y*c.x+b.x*c.y-b.y*c.x-a.y*b.x-a.x*c.y));
}
double angle(point &a,point &b){
return -atan2(a.y-b.y,a.x-b.x);// atan2定义很棒
}
double ar[maxn];
int main(){
#ifdef shuaishuai
freopen("C:\\Users\\hasee\\Desktop\\a.txt","r",stdin);
//freopen("C:\\Users\\hasee\\Desktop\\b.txt","w",stdout);
#endif
int t,kas=1;
int n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
p[0].input();p[1].input();
ar[0]=ar[1]=0.0;
for(int i=2;i<n;i++){
p[i].input();
ar[i]=ar[i-1]+area(p[i],p[i-1],p[0]);
}
double tot=ar[n-1];
int mid=2;
while(mid<n&&ar[mid]*2.0<tot)mid++;
// printf("mid :%d\n",mid);
double arl=tot*0.5-ar[mid-1 ];
point L=p[mid-1],R=p[mid];
double l=arl/(ar[mid]-ar[mid-1]);
point m;
m.x=L.x+l*(R.x-L.x);m.y=L.y+l*(R.y-L.y);
double theta=angle(m,p[0])-0.5*PI; //-0.5PI就是旋转到Y负的角度
// m.output();
// printf("theta :%.3lf\n",theta);
printf("Case %d:\n",kas);kas++;
// for(int i=0;i<n;i++)p[i].output();
for(int i=0;i<n;i++){
(p[i].rotate(theta)).output();
}
}
return 0;
}
学姐的代码我又打了一遍 比我的短一倍而且少了许多特判 代码写的好就是能规避很多需要特判的地方

浙公网安备 33010602011771号