閱讀148 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Ubuntu重置root 密碼
  下一篇:go pushbackDemo(Modalview present)