HDOJ水题集合11:桶排序, 折半搜索

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ水题集合11:桶排序, 折半搜索相关的知识,希望对你有一定的参考价值。

Solved Problem ID Title Ratio(Accepted / Submitted)
1001 sort 31.25%(15/48)
1002 解方程 34.29%(12/35)

1001 sort

Time Limit : 6000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 48 Accepted Submission(s) : 15
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3
3 -35 92 213 -644
Sample Output
213 92 3
Hint
请用VC/VC++提交
Author
LL
Source
ACM暑期集训队练习赛(三)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 5e5+10;
int a[maxn*2];
int main(){
	ios::sync_with_stdio(false);
	int n, m;
	while(cin>>n>>m){
		memset(a,0,sizeof(a));
		for(int i = 1; i <= n; i++){
			int x; cin>>x; a[x+maxn]++;
		}
		int bk = 0;
		for(int i = maxn*2-1; i >= 0; i--){
			while(a[i] && m){
				if(bk)cout<<" ";
				cout<<i-maxn;
				a[i]--; m--;
				bk = 1;
			}
			if(m==0)break;
		}
		cout<<"\\n";
	}
	return 0;
}


1002 解方程

Time Limit : 6000/3000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 35 Accepted Submission(s) : 12
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
给定一方程如下:
ax12 + bx22 + cx32 + dx42=0

其中:
a, b, c, d在整数区间[-50,50]内取值,并且都不等于0.

求方程在区间[-100,100] 内的非零整数解的个数。
Input
输入包含多组测试数据。
每组数据占一行,包含4个整数a b c d。
Output
请输出每组数据方程解的个数。
Sample Input
1 2 3 -4
1 1 1 1
Sample Output
39088
0

//变形得a*x1^2+b*x2^2=-c*x3^2-d*x4^2
//从1-100枚举x1,x2,记录解的值,再枚举x3,x4判断是否存在,有就累加
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e6+10, P=maxn/2;//+P防止负数
int h[maxn], f[110];
int main(){
	for(int i = 1; i <= 100; i++)f[i]=i*i;
	int a, b, c, d;
	while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
		if(a<0&&b<0&&c<0&&d<0||a>0&&b>0&&c>0&&d>0){
			printf("0\\n"); continue;
		}
		int ans = 0;
		for(int i = 1; i <= 100; i++)
			for(int j = 1; j <= 100; j++)
				h[a*f[i]+b*f[j]+P]++;
		for(int i = 1; i <= 100; i++)
			for(int j = 1; j <= 100; j++)
				ans += h[-c*f[i]-d*f[j]+P];
		printf("%d\\n", 16*ans);//2^4种交换abcd组合
		memset(h,0,sizeof(h));
	}
	return 0;
}


以上是关于HDOJ水题集合11:桶排序, 折半搜索的主要内容,如果未能解决你的问题,请参考以下文章

HDOJ水题集合10:卡特兰数

HDOJ/HDU 2561 第二小整数(水题~排序~)

[HDOJ5744]Keep On Movin(水题)

插入排序——2折半插入排序实现

CF1221G Graph And Numbers(折半搜索+图论)

[数据结构] 快速排序+折半搜索