HDU 4033 4036 4039 The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest

 都是队友写的,放在一起。

 

HDU 4033 Regular Polygon 

二分什么的。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;

double dis[105];
int n;
const double eps=1e-8;
bool tt(double a,double b,double c){
    if((a+b>c&&abs(a-b)<c)&&(a+c>b&&abs(a-c)<b)&&(b+c>a&&abs(b-c)<a))
        return 1;
    return 0;
}
int ff(double a,double b,double c){
    if(a+b<=c)
        return 2;
    return 3;
}
int ok(double x){
    double a,b,c;
    double res=0;
    for(int i=1;i<n;i++){
        a=dis[i];
        b=dis[i+1];
        c=x;
        if(tt(a,b,c)){
            double det=acos((a*a+b*b-c*c)/(2.0*a*b));
            res+=det;
        }
        else 
            return ff(a,b,c);
    }
    a=dis[n];b=dis[1];c=x;
    if(tt(a,b,c)){
        double det=acos((a*a+b*b-c*c)/(2.0*a*b));
        res+=det;
    }
    else{
        return ff(a,b,c);
    }
    if(fabs(res-2*acos(-1))<1e-8)
        return 4;
    else if(res>2*acos(-1))
        return 5;
    return 6;
}
int main(){
    int T,tt=0;scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf",&dis[i]);
        double tmp=eps;
        double l=eps,r=1000000000.0;
        for(int i=1;i<n;i++){
            if(dis[i]+dis[i+1]>tmp){
                tmp=dis[i]+dis[i+1];
                if(tmp<r)
                    r=tmp;
            }
        }
        printf("Case %d: ",++tt);
        double key;
        bool f=0;
        while(fabs(r-l)>eps){
            double mid=(l+r)/2;
            int x=ok(mid);
            if(x==4){
                key=mid;
                f=1;
                break;
            }
            if(x==2||x==5){
                r=mid;
            }
            else    
                l=mid;
        }
        if(f)
            printf("%.3lf\n",key);
        else
            printf("impossible\n");
    }
    return 0;
}

 
HDU 4036 Rolling Hongshu
据说是DP。
ps:其实他不太会DP^_^
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>

#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define Max(x,y) (x>y?  x:y)
#define Min(x,y) (x<y?  x:y)
#define Seg(x) ((x>eps) - (x<-eps))
#define MAXN 1100
#define MAXM 10000100
#define g 20

using namespace std;

int t,n,m,cases=0;
double mm;

struct point
{
    double x,y;
    point(){}
    point(double xx,double yy){x=xx;y=yy;}
}p[MAXN];
    
struct blue
{
    double x,v,mm;
}ball[MAXN];
    
double dp[MAXN];

vector<int> vec[MAXN];

point Interpoint(point u1,point u2,point v1,point v2)//两相交直线交点
{
    point ret=u1;
    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/
                ((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
    ret.x+=(u2.x-u1.x)*t;
    ret.y+=(u2.y-u1.y)*t;
    return ret;
}


int main()
{
    int i,j;
    double ans;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%lf",&n,&m,&mm);
        for(i=1;i<=n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        
        for(i=1;i<=m;i++)
            scanf("%lf%lf%lf",&ball[i].x,&ball[i].v,&ball[i].mm);
        
        for(i=0;i<=n;i++)
            vec[i].clear();
        
        memset(dp,0,sizeof(dp));

        for(i=1;i<=m;i++)
            for(j=1;j<n;j++)
            {
                if(Seg(ball[i].x-p[j].x)>=0&&Seg(ball[i].x-p[j+1].x)==-1)
                    vec[j].push_back(i);
            }
        memset(dp,0,sizeof(dp));
        for(i=n-1;i>=1;i--)
        {
            if(vec[i].size()==0)
            {
                if(Seg(p[i].y-p[i+1].y)==1) //down
                {
                    double ww=mm*g*(p[i].y-p[i+1].y);
                    double www=0.5*mm*dp[i+1]*dp[i+1];
                    if(Seg(www-ww)==1)
                        dp[i]=sqrt(((www-ww)*2)/mm);
                    else
                        dp[i]=0;
                }
                else if(Seg(p[i].y-p[i+1].y)==-1)
                {
                    double ww=0.5*mm*dp[i+1]*dp[i+1]+mm*g*(p[i+1].y-p[i].y);
                    dp[i]=sqrt((ww*2)/mm);
                }
                else
                    dp[i]=Max(dp[i+1],dp[i]);
            }
            else
            {
                for(j=0;j<vec[i].size();j++)
                {
                    point now=Interpoint(p[i],p[i+1],point(ball[vec[i][j]].x,0),point(ball[vec[i][j]].x,1));
                    if(Seg(p[i].y-p[i+1].y)==1) //down
                    {
                        double a=ball[vec[i][j]].v*ball[vec[i][j]].v;
                        double b=2*g*(p[i].y-now.y);
                        double ww,www;
                        
                        if(Seg(a-b)<=0)    ww=0;
                        else    ww=sqrt(a-b);
                        
                        a=dp[i+1]*dp[i+1];
                        b=2*g*(p[i].y-p[i+1].y);
                        
                        if(Seg(a-b)<=0)    www=0;
                        else    www=sqrt(a-b);

                        dp[i]=Max(dp[i],ww);
                        dp[i]=Max(dp[i],www);
                    }
                    else  if(Seg(p[i].y-p[i+1].y)==-1)
                    {
                        double a=ball[vec[i][j]].v*ball[vec[i][j]].v;
                        double b=2*g*(now.y-p[i].y);
                        
                        double ww,www;
                        
                        if(Seg(a+b)<=0)    ww=0;
                        else    ww=sqrt(a+b);
                        
                        a=dp[i+1]*dp[i+1];
                        b=2*g*(p[i+1].y-p[i].y);
                        
                        if(Seg(a+b)<=0)    www=0;
                        else     www=sqrt(a+b);

                        dp[i]=Max(dp[i],ww);
                        dp[i]=Max(dp[i],www);
                    }
                    else 
                    {
                        dp[i]=Max(dp[i],ball[vec[i][j]].v);
                        dp[i]=Max(dp[i],dp[i+1]);
                    }
                }
            }
        }
        printf("Case %d: %.2lf\n",++cases,dp[1]);
    }
}

不知道是什么^_^
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
using namespace std;
int peo[2010][2010];
map<string,int> my;
char peop[2010][20];
int flag[2010];
struct Ans{
       char name[20];
};
Ans ans[2010];
bool cmp(Ans aa,Ans bb){
     int temp=strcmp(aa.name,bb.name);
     if(temp<0) return 1;
     else return 0;
}
main(){
     int i,ii,j,k,t,tt,n,q,plen,ansl,maxn;
     char a[20],b[20];
     scanf("%d",&t);
     for(tt=1;tt<=t;tt++){
         printf("Case %d:\n",tt);
         memset(peo,0,sizeof(peo));
         memset(peop,0,sizeof(peop));
         scanf("%d%d",&n,&q);
         my.clear();
         plen=0;
         for(i=1;i<=n;i++){
             memset(a,0,sizeof(a));
             memset(b,0,sizeof(b));
             scanf("%s %s",a,b);
             int tt1,tt2;
             if(my[a]==0){
                my[a]=++plen;
                strcpy(peop[plen],a);
             }
             if(my[b]==0){
                my[b]=++plen;
                strcpy(peop[plen],b);
             }
             tt1=my[a];tt2=my[b];
             peo[tt1][tt2]=peo[tt2][tt1]=1;
         }
         for(ii=1;ii<=q;ii++){
             memset(flag,0,sizeof(flag));
             memset(a,0,sizeof(a));
             scanf("%s",a);
             int temp=my[a];
             for(j=1;j<=plen;j++){
                 if(peo[temp][j]){
                    for(k=1;k<=plen;k++){
                        if(!peo[temp][k]&&temp!=k&&peo[j][k]) flag[k]++;
                    }
                 }
             }
             maxn=0;ansl=0;
             for(i=1;i<=plen;i++) if(flag[i]>maxn) maxn=flag[i];
             if(maxn==0) printf("-\n");
             else{
                  for(i=1;i<=plen;i++)
                      if(flag[i]==maxn){
                         memset(ans[ansl].name,0,sizeof(ans[ansl].name));
                         strcpy(ans[ansl++].name,peop[i]);
                      }
                  sort(ans,ans+ansl,cmp);
                  printf("%s",ans[0].name);
                  for(i=1;i<ansl;i++) printf(" %s",ans[i].name);
                  printf("\n");
             }
         }
     }
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值