UVA-1612 Guess (贪心)

题目大意:考试共有三道题,n个人,每个人对每道题的可能得分已知,现在已知考后排名情况,问排名合不合理。

题目分析:贪心。贪心策略:每处理一个排名,都让他的得分尽量高。

 

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;

const double INF=1e10;

double a[16385][3],b[8];
int rk[16385];

double getMax(int id,double high,double low)
{
    int cnt=0;
    for(int i=1;i<=3;++i){
        for(int j=0;j+i-1<3;++j){
            double sum=0.0;
            for(int k=j;k<=j+i-1;++k)
                sum+=a[id][k];
            b[cnt++]=sum;
        }
    }
    b[cnt++]=a[id][0]+a[id][2];
    double res=-1.0;
    for(int i=0;i<cnt;++i)
        if(b[i]>low&&b[i]<high)
            res=max(res,b[i]);
    return res;
}

double judge(int n)
{
    double lst;
    for(int i=0;i<n;++i){
        if(i==0){
            lst=a[rk[i]-1][0]+a[rk[i]-1][1]+a[rk[i]-1][2];
            continue;
        }
        if(rk[i]>rk[i-1]){
            lst=getMax(rk[i]-1,lst+0.01,-0.01);
        }else
            lst=getMax(rk[i]-1,lst,-0.01);
        if(lst==-1.0)
            return -1.0;
    }
    return lst;
}

int main()
{
    int n,cas=0;
    while(scanf("%d",&n)&&n)
    {
        for(int i=0;i<n;++i){
            for(int j=0;j<3;++j)
                cin>>a[i][j];
            sort(a[i],a[i]+3);
        }
        for(int i=0;i<n;++i)
            scanf("%d",rk+i);

        printf("Case %d: ",++cas);
        double k=judge(n);
        if(k!=-1.0)
            printf("%.2lf\n",k);
        else
            printf("No solution\n");
    }
    return 0;
}

  

posted @ 2015-10-12 15:21  20143605  阅读(164)  评论(0编辑  收藏  举报