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;
}




相关文章
UVa11565 - Simple Equations
UVa11565 - Simple Equations
50 0
|
Java 文件存储
HDOJ(HDU) 2123 An easy problem(简单题...)
HDOJ(HDU) 2123 An easy problem(简单题...)
167 0
|
Java 文件存储
HDOJ(HDU) 2132 An easy problem
HDOJ(HDU) 2132 An easy problem
105 0
|
数据挖掘
HDOJ 1032(POJ 1207) The 3n + 1 problem
HDOJ 1032(POJ 1207) The 3n + 1 problem
128 0
【HDU 5572 An Easy Physics Problem】计算几何基础
2015上海区域赛现场赛第5题。 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5572 题意:在平面上,已知圆(O, R),点B、A(均在圆外),向量V。
1034 0