• FZU-1925+几何


    题意简单。

    由于没有注意到椭圆不一定是在圆心。。贡献无数的wa。。。。。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<stdlib.h>
    #include<math.h>
    using namespace std;
    
    const int maxn = 555;
    const int maxm = 555;
    const double eps = 1e-8;
    
    struct Node{
    	char name[55];
    	char nation[55];
    	int sum;
    	int id;
    	double x,y;
    }p[ maxn ];
    
    struct Cir{
    	double r;
    	double x,y;
    	int val;
    }c1[ maxm ];
    struct Cir2{
    	double x,y;
    	double a,b;
    	int val;
    }c2[ maxm ];
    struct Point {
    	double x,y;
    };
    struct Ploy{
    	Point pnt[ maxn ];
    	int cnt;
    	int val;
    }ploy[ maxm ];
    
    int od[ maxm ];
    
    int cmp( Node a,Node b ){
    	if( a.sum!=b.sum ) return a.sum>b.sum;
    	else return a.id<b.id;
    }
    
    double dis( double x1,double y1,double x2,double y2 ){
    	return ( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );
    }
    
    bool InCir( Node aim,int ID ){
    	double dd = dis( aim.x,aim.y,c1[ID].x,c1[ID].y );
    	if( dd<=c1[ID].r*c1[ID].r ) return true;
    	else return false;
    } 
    
    bool InCir2( Node aim,int ID ){
    	double dd = (aim.x-c2[ID].x)*(aim.x-c2[ID].x)/(c2[ID].a*c2[ID].a)+(aim.y-c2[ID].y)*(aim.y-c2[ID].y)/(c2[ID].b*c2[ID].b);
    	if( dd<=1.0 ) return true;
    	else return false;
    }
    
    int D( double x ){
    	return x<-eps?-1:x>eps;
    }
    
    double det( Point a,Point b,Point c ){
    	return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
    }
    
    int InPloy1( int n,double xx,double yy,Point pnt[] ){
    	Point q;
    	q.x = xx,q.y = yy;
    	int i,s[3] = {1,1,1};
    	pnt[n] = pnt[0];
    	for( int i=0;i<n&&s[0]|s[2];i++ ){
    		s[ D(det(pnt[i],pnt[i+1],q))+1 ] = 0;
    	}
    	return s[0]|s[2];
    }
    int InPloy2( int n,double xx,double yy,Point pnt[] ){
    	Point q;
    	q.x = xx;
    	q.y = yy;
    	int i,s[3] = {1,1,1};
    	pnt[n] = pnt[0];
    	for( int i=0;i<n&&s[1]&&s[0]|s[2];i++ ){
    		s[ D(det(pnt[i],pnt[i+1],q))+1 ] = 0;
    	}
    	return s[1]&&s[0]|s[2];
    }
    
    void init(){
    	for( int i=0;i<maxn;i++ )
    		p[i].sum = 0;
    }
    
    void test( int n ){
    	for( int i=1;i<=n;i++ ){
    		printf("name = %s, sum = %d
    ",p[i].name,p[i].sum);
    	}
    }
    
    int main(){
    	int T;
    	scanf("%d",&T);
    	int Case = 1;
    	while( T-- ){
    		int n,m;
    		scanf("%d",&m);
    		init();
    		char str[ 55 ];
    		for( int i=1;i<=m;i++ ){
    			scanf("%s",str);
    			if( str[0]=='C' ){
    				od[ i ] = 1;
    				scanf("%lf%lf%lf%d",&c1[ i ].x,&c1[ i ].y,&c1[ i ].r,&c1[ i ].val);
    			}
    			else if( str[0]=='E' ){
    				od[ i ] = 2;
    				scanf("%lf%lf%lf%lf%d",&c2[ i ].x,&c2[ i ].y,&c2[ i ].a,&c2[ i ].b,&c2[ i ].val);
    			}
    			else {
    				od[ i ] = 3;
    				int cc;
    				scanf("%d",&cc);
    				for( int j=0;j<cc;j++ ){
    					scanf("%lf%lf",&ploy[i].pnt[j].x,&ploy[i].pnt[j].y);
    				}
    				ploy[i].cnt = cc;
    				scanf("%d",&ploy[i].val);
    			}
    		}
    		scanf("%d",&n);
    		for( int i=1;i<=n;i++ ){
    			scanf("%s%s%lf%lf",p[i].name,p[i].nation,&p[i].x,&p[i].y);
    			//p[i].sum = 0;
    			p[i].id = i;
    		}
    		for( int i=1;i<=n;i++ ){
    			for( int j=1;j<=m;j++ ){	
    				if( od[j]==1&&InCir( p[i],j )==true ){
    					p[i].sum += c1[j].val;
    				}
    				else if( od[j]==2&&InCir2( p[i],j )==true ){
    					p[i].sum += c2[j].val;
    				}
    				else if( od[j]==3&&(InPloy1( ploy[j].cnt,p[i].x,p[i].y,ploy[j].pnt )||InPloy2( ploy[j].cnt,p[i].x,p[i].y,ploy[j].pnt )) ){
    					p[i].sum += ploy[j].val;
    				}
    			}
    		}
    		
    		sort( p+1,p+1+n,cmp );
    		//test( n );
    		printf("Case %d:
    ",Case ++ );
    		int Gold = 0;
    		if( p[1].sum<=0 ) continue;
    		int flag = 1;
    		for( int i=1;i<=n;i++ ){
    			if( p[i].sum==p[1].sum&&p[1].sum>0 ){
    				printf("Gold Medal: %s from %s got %d point(s)
    ",p[i].name,p[i].nation,p[i].sum);
    				Gold ++ ;
    				flag = i;
    			}
    			else break;
    		}
    		if( p[flag+1].sum<=0 ) continue;
    		if( Gold>=3 ) continue;
    		int Silver = 0;
    		int temp = flag+1;
    		bool f = false;
    		for( int i=temp;i<=n;i++ ){
    			if( p[i].sum==p[temp].sum && p[i].sum>0 ){
    				flag = i;
    				Silver ++ ;
    				if( Gold<=1 ) printf("Silver Medal: %s from %s got %d point(s)
    ",p[i].name,p[i].nation,p[i].sum);
    				else{
    					f = true;
    					 printf("Bronze Medal: %s from %s got %d point(s)
    ",p[i].name,p[i].nation,p[i].sum);
    				}
    			}
    			else break;
    		}
    		if( Silver+Gold>=3||f==true ) continue;
    		if( p[flag+1].sum<=0 ) continue;
    		for( int i=flag+1;i<=n;i++ ){
    			if( p[i].sum==p[flag+1].sum&&p[i].sum>0 ){
    				printf("Bronze Medal: %s from %s got %d point(s)
    ",p[i].name,p[i].nation,p[i].sum);
    			}
    			else break;
    		}
    	}
    	return 0;
    }



  • 相关阅读:
    document.referrer
    uniapp打包apk(真机测试没问题,打包apk后部分功能没反应)
    electron初次学习(新建项目打包到应程序)
    localstorage和sessionStorage一起使用的坑
    字符串去掉第一个和最后一个逗号
    uni.switchTab()跳转不刷新
    2022中国准独角兽企业100强
    火星家园创意比赛规则1
    57所学校195个小组409名学生1
    57所学校195个小组409名学生
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3301823.html
Copyright © 2020-2023  润新知