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