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

举报
小哈里 发表于 2022/05/10 23:17:07 2022/05/10
【摘要】 Solved Problem ID Title Ratio(Accepted / Submitted) 1001 sort 31.25%(15/48) 1002 解方程 34.29%(12/35) 10...

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;
}


文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/116721117

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。