hdoj 哈希

队长给大一的拉了一些题目,自己闲着没事也做做,终于知道自己有多么水了。。。水的没话说啊。。。

不过有一个学妹超厉害,佩服,希望壮大我SYUCT。。。

1.、sort              题目描述

自己看到这个题目就兴奋了,说试着水一下,可是TLE了,知道自己的错误了。。。最后用了哈希。。。。。。。

可是看学妹的代码,人家是用快排写的,竟然过了,我暗暗的佩服qsort了好长时间。。。。。。。。。。

贴上自己抄袭的代码吧。。。。。。。

/* ***********************************************
Author        :Mosu
Created Time  :2015/3/27 18:18:55
File Name     :A.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

int a[1000009];
int main()
{
	int n,m,max=-1;
	int temp;
	while(scanf("%d%d",&n,&m)==2)
	{
		int cnt=0;
		memset(a,0,sizeof(a[0])*1000001);
		for(int i=0;i<n;i++)
		{
			scanf("%d",&temp);
			if(temp>=max)
			{
				max=temp;
			}
			a[temp+500000]=1;
		}
		int j=max+500000;
		while(j>=0)
		{
			if(a[j]==1)
			{
				printf("%d",j-500000);
				cnt++;
				if(cnt==m)
				{
					printf("\n");
					break;
				}
				else
				{
					printf(" ");
				}
			}
			j--;
		}
	}
	return 0;
}
 
 


2、Equations  点击打开链接

一个简单的哈希题目,可以看成a*aa+b*bb+1000000=1000000-c*cc-d*dd。。。。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;


const int Max=1000000;
int h[Max*2+10];


int main()                                                              //a*aa+b*bb+Max=Max-c*cc-d*dd
{
	int a,b,c,d,cnt;
	while(scanf("%d%d%d%d",&a,&b,&c,&d)==4)
	{

		if((a>0&&b>0&&c>0&&d>0)||(a<0&&b<0&&c<0&&d<0))  //最先的判断,否则超时
		{
			cout<<'0'<<endl;
			continue;
		}

		memset(h,0,sizeof(h));

		cnt=0;

		for(int i=1;i<=100;i++)
			for(int j=1;j<=100;j++)
			{
				//ans=a*i*i+b*j*j;
				h[a*i*i + b*j*j + Max]++;
			}
		for(int i=1;i<=100;i++)
			for(int j=1;j<=100;j++)
			{ 
				cnt+=h[Max-c*i*i-d*j*j];
			}


		cnt*=16;             // 对应不同的正负形,于是一共有 2^4 种可能


		printf("%d\n",cnt);
	}
	return 0;
}

3、Flying to the Mars   点击打开链接

题意是最大的问题,题目的意思是n个人,他们有不同的等级,等级高的给等级低的当师傅,但一个人只能有一个师傅和一个徒弟。。。

考虑到这里,我们要想到,对排好序的n个人,{{a1,a2,a3...an},{b1,b2,b3,...bn}..{c1,c2,c3...cn}},最大的需要则是取决于n的大小,即是最大的相等的分法。。。。。。

具体的看代码吧,只用一个简单的map即可完成,自己对于map的学习还是很弱的,这下需要加强了。。。。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int cmp(int a,int b)
{
	return a>b;
}

int main()
{
	int n;
	while(scanf("%d",&n)==1)
	{
		map<int,int>mp;
		int a;
		int Max=-1000000000;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a);
			mp[a]++;
			if(mp[a]>Max)
			{
				Max=mp[a];
			}
		}
		cout<<Max<<endl;
	}
	return 0;
}

4、A simple problem 点击打开链接


一个直接模拟的题目,其实自己还是不理解为什么要放到hash中,不过自己对于模拟处理的也不好。。。。。。。。。。

多做题吧。。。。。。。。。。

/* ***********************************************
Author        :Mosu
Created Time  :2015/3/27 18:18:55
File Name     :A.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

int cmp(int a,int b)
{
	return a>b;
}
int s[5000000];
int main()
{
	int T,n;
	cin>>T;
	while(T--)
	{
		scanf("%d",&n);
		if(n<0)
		{
			printf("-");
			n=-n;
		}
		memset(s,0,(n+100)*sizeof(s[0]));
		int cnt=0;
		int uu=1,dd=n;
		if(n==1)
		{
			printf("1\n");
			continue;
		}
		printf("0.");
		while(uu!=0)
		{
			s[uu]=1;
			uu=uu*10;
			printf("%d",uu/dd);
			uu=uu%dd;
			if(s[uu])
				break;
		}
		printf("\n");
	}
	return 0;
}

好了,就这样了,其他的我也不会,在努力吧。。。。。。。。。。。。。。自己就是弱逼。。。。。。。。。。没办法啊。。。。。

你可能感兴趣的:(hdoj 哈希)