1. 程式人生 > >UVA815 洪水 紫書習題 4-10

UVA815 洪水 紫書習題 4-10

UVA815 洪水 紫書習題 4-10

寫題之前,先講下自己的思路,用個快速排序,把格子高度從高到矮排好,然後假設所有格子都有水,算出高度,如果高度小於最高的格子,就把最高的格子從列表中刪去,繼續計算,直到算出正確答案。
快速排序庫 stdlib.h 裡的qsort函式

寫完後,發現輸出空,程式未正常結束,檢查了一下 原因是scanf %d的時候要加個地址符號。 然後又發現自己去除陣列最大值的時候,標號忘了減一,因為陣列是從0開始的。
然後改完後,過了樣例,開始提交oj。

第一次提交 wa 使用debug查詢原因,查詢前懷疑是浮點數問題。
通過比對,發現自己錯在兩組輸出間要空出一行!!!題目裡的樣例輸入只給了一組,所以忘了看說明了,加了個\n後,ac了。這題寫的好快呀 20分鐘就寫完了,紫書說思路有很多,還有什麼思路呢?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int high[910];
int m,n,kase=0;
int cmp(const void *a,const void *b)
{
    return (*(int*)a-*(int*)b);
}
int main()
{
//    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
    while(scanf("%d%d",&m,&n)==2&&m)
    {
        int mn=m*n;
        memset(high,0,sizeof(high));
        int totalh=0;
        for(int i=0;i<mn;i++)
        {

            scanf("%d",&high[i]);
            totalh+=high[i];

        }
        int water;scanf("%d",&water);
        qsort(high,mn,sizeof(int),cmp);
        double result;
        for(;;)
        {
            result=((water+0.0)/100+totalh)/mn;
            if (result>high[mn-1])break;
            totalh-=high[mn-1];
            mn--;
        }
        printf("Region %d\n",++kase);
        printf("Water level is %.2f meters.\n",result);
        printf("%.2f percent of the region is under water.\n\n",100*(mn+0.0)/(m*n));


    }
    return 0;
}