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