hdu 1425sort
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int N= 500003;
int has[1000002];
int main()
{
int n,m,i,a;
while(~scanf("%d%d",&n,&m))
{
int flag=0;
for(i=0;i<n;i++)
{
scanf("%d",&a);
has[N+a]++;
}
for(i=N*2;i&&m;i--)
{
if(has[i])
{
if(flag) printf(" ");
printf("%d",i-N);
m--;
flag=1;
}
}
printf("\n");
}
return 0;
}
hdu 1280 前m大的数
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
using namespace std;
int a[3002],b[10002];
int main()
{
int m,n,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(b,0,sizeof(b));
int k=0,flag=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
b[a[i]+a[j]]++;
}
for(i=10000;i&&m;)
{
if(b[i])
{
if(flag) printf(" ");
printf("%d",i);
b[i]--;
m--;
flag=1;
}
else i--;
}
printf("\n");
}
return 0;
}
这道题数太大,直接暴力绝壁超时,花了1个小时找hash什么玩意
如果用Hash的思路的话
1.用内存换时间
2.只需要两重循环,+Hash存储查找就行了。// 一般哈希的题都有这步
3.将4重循环分解为两个两重循环 //1和3都行但是2肯定最快
4.查找满足条件的记录下来 。
hdu 1496 Equations
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define PI 3.1415926;
int s[102],has[2000003];
int main()
{
int i,j;
for(i=1;i<=100;i++)
{
s[i]=i*i;
}
int d,a,b,c;
while(~scanf("%d%d%d%d",&a,&b,&c,&d))
{
if(a>0&&b>0&&c>0&&d>0||a<0&&b<0&&c<0&&d<0)
{
printf("0\n");
continue;
}
memset(has,0,sizeof(has));
int sum=0;
for(i=1;i<101;i++)
for(j=1;j<101;j++)
{
has[s[i]*a+s[j]*b+1000000]++;//加100000是防止下标为负;
}
for(i=1;i<101;i++)
for(j=1;j<101;j++)
{
sum+=has[-(s[i]*c+s[j]*d)+1000000];
}
printf("%d\n",sum*16);
}
return 0;
}