现在的位置: 首页 > 综合 > 正文

HDOJ Flying to the Mars

2017年07月16日 ⁄ 综合 ⁄ 共 3043字 ⁄ 字号 评论关闭

Flying to the Mars

Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 14   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description



In the year 8888, the Earth is ruled by the PPF Empire . As the population growing , PPF needs to find more land for the newborns . Finally , PPF decides to attack Kscinow who ruling the Mars . Here the problem comes! How can the soldiers reach the Mars ? PPF
convokes his soldiers and asks for their suggestions . “Rush … ” one soldier answers. “Shut up ! Do I have to remind you that there isn’t any road to the Mars from here!” PPF replies. “Fly !” another answers. PPF smiles :“Clever guy ! Although we haven’t got
wings , I can buy some magic broomsticks from HARRY POTTER to help you .” Now , it’s time to learn to fly on a broomstick ! we assume that one soldier has one level number indicating his degree. The soldier who has a higher level could teach the lower , that
is to say the former’s level > the latter’s . But the lower can’t teach the higher. One soldier can have only one teacher at most , certainly , having no teacher is also legal. Similarly one soldier can have only one student at most while having no student
is also possible. Teacher can teach his student on the same broomstick .Certainly , all the soldier must have practiced on the broomstick before they fly to the Mars! Magic broomstick is expensive !So , can you help PPF to calculate the minimum number of the
broomstick needed .
For example : 
There are 5 soldiers (A B C D E)with level numbers : 2 4 5 6 4;
One method :
C could teach B; B could teach A; So , A B C are eligible to study on the same broomstick.
D could teach E;So D E are eligible to study on the same broomstick;
Using this method , we need 2 broomsticks.
Another method:
D could teach A; So A D are eligible to study on the same broomstick.
C could teach B; So B C are eligible to study on the same broomstick.
E with no teacher or student are eligible to study on one broomstick.
Using the method ,we need 3 broomsticks.
……

After checking up all possible method, we found that 2 is the minimum number of broomsticks needed. 

Input

Input file contains multiple test cases. 
In a test case,the first line contains a single positive number N indicating the number of soldiers.(0<=N<=3000)
Next N lines :There is only one nonnegative integer on each line , indicating the level number for each soldier.( less than 30 digits);

Output

For each case, output the minimum number of broomsticks on a single line.

Sample Input

4
10
20
30
04
5
2
3
4
3
4

Sample Output

1
2

一:上升串求法,将数组从小打到进行排序,然后找出数组中上升串的个数,即为题目要求的输出结果。
代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
	int n,i,j,a[3100],b[3100],t,sum;
    while(scanf("%d",&n)!=EOF)
    {
    	memset(b,0,sizeof(b));//将数组b中所有元素初始化为零 
    	for(i=0;i<n;i++)
    		scanf("%d",&a[i]);
    	sort(a,a+n);
    	t=0;
    	for(i=0;i<n;i++)
    	{
    		if(!b[i])//!b[i]判断b[i]的值是否为0,判断结果为真则进行if语句中的内容 
    		{
    			for(j=i+1,b[i]=1,sum=a[i];j<n;j++)
    			{
    				if(!b[j]&&a[j]>sum)
    				{
    					b[j]=1;
    					sum=a[j];
    				}
    			}
    			t++;//t标记上升串的个数 
    		}
    	}
    	printf("%d\n",t);
    }
    return 0;
}

二:求众数法(map函数法):这道题我的第一思路就是求出众数,众数的个数就是需要的扫帚的个数。

         但是用for循环和数组求解不行,数组的储存空间不够。师傅让用map函数求解。第一次接触
         map函数,基本看不懂,只知道表示映射关系。粘贴一下师傅的map函数代码。

#include<stdio.h>
#include<stdlib.h>
#include<map>
using namespace std;
int main()
{
	int n,t,max;
	while(scanf("%d",&n)!=EOF)
	{
		map<int,int>mapint;//注意书写map的格式 
		max=0;
		while(n--)
		{
			scanf("%d",&t);
			mapint[t]++;
			if(mapint[t]>max)
				max=mapint[t];
		}
		printf("%d\n",max);
	}
	return 0;
} 
2014年的最后一篇博文,希望来年能学到更多。加油,努力成为ACMer。

抱歉!评论已关闭.