开始题意搞错了,一直以为是最简单的问题才行。。。
后来看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; }