poj 2535 Very Simple Problem
開始題意搞錯了,一直以為是最簡單的問題才行。。。
後來看discuss才發現隻要簡單就可以了,裏麵看到一個很不錯的題意解釋。。。
問題: n個人給p道題打分,一道題是最容易題的條件: 該題被評為最簡單的次數要過半,而且該題沒有被任何評委評為最難。 方法: 可設置3個數組,數組A用來讀入數據,數組B紀錄對應的題目是否被 打成“最難”的了, 數組C紀錄該道題被評委打成“最簡單”的次數.當然 這個“最難”和“最簡單”隻是針對這個評委給這P道題目的打分了。 所以,每次讀入一行時,判斷最難的題和最簡的題(即該評委給分給的最高和最低的), 然後將對應的B置為1,對應的C增加1。 最後: 再遍曆所有題目,“沒有被標記為最難的以及被標記為最簡單的數目過半的題”就是簡單題。
思路也很清晰。
#include <stdio.h> #include <string.h> int problemRank[102]; int isHardest[102]; int main() { int N,P; int minNum,maxNum; scanf("%d%d",&N,&P); int i,j; int nowProblemScore[102]; memset(problemRank,0,sizeof(problemRank)); memset(isHardest,0,sizeof(isHardest)); for(i=0;i<N;i++) { minNum=0x7fffffff; maxNum=-1; for(j=0;j<P;j++) { scanf("%d",&nowProblemScore[j]); if(nowProblemScore[j]<minNum) minNum=nowProblemScore[j]; if(nowProblemScore[j]>maxNum) maxNum=nowProblemScore[j]; } //printf("minNum == %d\n",minNum); //ok for(j=0;j<P;j++) { if(minNum == nowProblemScore[j]) problemRank[j]++; if(maxNum == nowProblemScore[j]) isHardest[j]=1; } } /*for(j=0;j<P;j++) printf("%d ",problemRank[j]); printf("end\n");*/ for(i=0;i<P;i++) if(isHardest[i]==0 && problemRank[i]>N/2) { printf("%d",i+1); break; } if (i == P) { printf("0\n"); return 0; } //最後的輸出 for(j=i+1;j<P;j++) if(isHardest[j]==0 && problemRank[j]>N/2) printf(" %d",j+1); printf("\n"); return 0; }
最後更新:2017-04-03 05:40:03