1. 程式人生 > >勇者鬥惡龍

勇者鬥惡龍

有n個頭的惡龍,m個騎士可以僱傭,
一個能力值為x的勇士可以砍掉直徑不超過x的頭,且需要佣金x個金幣,
如何僱傭騎士砍掉所有的頭使支付金幣最少(一個騎士只能砍一個頭)

int main()
                {
        int n,m,temp,sum;
    int x[20],e[20];
    while(scanf("%d %d",&n,&m)&&n!=0&&m!=0)
    {
        int ***k=-1;***
        //k=-1的賦值的位置比較重要
        for(int i=0
; i<n; i++) scanf("%d",&e[i]); for(int i=0; i<m; i++) scanf("%d",&x[i]); for(int i=0; i<n; i++) for(int j=i+1; j<n; j++)//將給出的e[n],x[m]按從大到小氣泡排序 { if(e[i]<e[j]) { temp=e[i]; e[i]=e[j]; e[j]=temp; } } for
(int i=0; i<m; i++) for(int j=i+1; j<m; j++) { if(x[i]<x[j]) { temp=x[i]; x[i]=x[j]; x[j]=temp; } } **sum=0**;//sum=0的賦值位置確定 for(int i=0; i<n; i++) { **if
(k==-2)//和後面k=-2時的break一起,可以跳出二重迴圈 break;** k=-2; for(int j=0; j<m; j++) { if((e[i]<=x[j])&&(x[j]!=0))//頭i<=xj且xj沒有被僱傭過 k=j; } **if(k==-2)** { printf("Loowater is doomed!\n"); **break;** } sum+=x[k]; x[k]=0;//用0標記xj,表示其被僱傭過 if(i==n-1) printf("%d\n",sum); } return 0; }

/*輸入輸出示例
輸入:
2 3
5
4
7
8
4
2 1
5
5
10
0 0
輸出:
11
Loowater is doomed!
*/