码迷,mamicode.com
首页 > 其他好文 > 详细

挑战程序设计竞赛选录:1

时间:2014-09-30 18:53:39      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   os   ar   strong   for   sp   div   

 计算机 1s 的计算能力:1000 000 次, 游刃有余; 10 000 000,勉强; 100 000 000,很悬,一般不能。   

1.1 抽签

有 n 张纸片, 每个纸片上一个任意数字 ki 。取出 1 张,记下数字后放回,取 4 次。如果 4 个数字的和是 m, 则赢。给定一个 m, 判断是否有赢的可能性 (输出 Yes or No)。

 Limits : (1 <= n <= 1000, 1 <= m <= 108, 1<= ki <= 108)

样例1:输入:n = 3, m = 10, k = {1, 3, 5}     输出: Yes (如:1, 1, 3, 5)

样例2:输入:n = 3, m = 9, k = {1, 3, 5}     输出: No (不存在)

思路: 若递归四次: 10004 >> 109, 肯定超时,故此方法不可取。

优化方法:任意两个的和共 n2 个, 只要从 n2 个数中找到有没有两个数的和为 m 即可。同时,对这 n2 个数排序,利用二分查找求解。

时间复杂度: O(N2logN)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main () {
	int n, m;
	cin >> n >> m;
	vector<int> k(n);
	vector<int> sum(n*n);
	for (int i = 0; i < n; ++i) cin >> k[i];
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			sum[i*n+j] = k[i] + k[j];
		}
	}
	sort(sum.begin(), sum.end());
	bool exist = false;
	for(int i = 0; i < n; ++i) {
		if (binary_search(sum.begin(), sum.end(), m-sum[i])) {
			exist = true;
			break;
		}
	}
	if(exist) cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}

 

挑战程序设计竞赛选录:1

标签:style   blog   io   os   ar   strong   for   sp   div   

原文地址:http://www.cnblogs.com/liyangguang1988/p/4002197.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!