原题链接:https://vjudge.net/problem/UVA-1612
分类:贪心法
备注:细节题
算是简单题,但是细节很重要。
#include<bits/stdc++.h>
using namespace std;
const int maxn=16400;
int n,rk[maxn],a[maxn][3],sc[maxn][9],kase;
int solve(){
int res=sc[rk[1]][0];
for(int i=2;i<=n;i++){
int ok=0;
if(rk[i-1]<rk[i]){
for(int j=0;j<8;j++)
if(sc[rk[i]][j]<=res)
{res=sc[rk[i]][j]; ok=1; break;}
}else{
for(int j=0;j<8;j++)
if(sc[rk[i]][j]<res)
{res=sc[rk[i]][j]; ok=1; break;}
}
if(!ok)return -1;
}
return res;
}
int main(void){
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n)&&n){
memset(sc,0,sizeof(sc));
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++){
double x; scanf("%lf",&x);
a[i][j]=(int)round(x*100.0);
}
for(int j=0;j<8;j++)
for(int k=0;k<3;k++)
if((1<<k)&j)sc[i][j]+=a[i][k];
sort(sc[i],sc[i]+8,greater<int>());
}
for(int i=1;i<=n;i++)scanf("%d",&rk[i]);
int ans=solve(); printf("Case %d: ",++kase);
if(ans<0)printf("No solution\n");
else printf("%.2lf\n",(double)(ans/100.0));
}
return 0;
}