P8834 [传智杯 #3 决赛] 序列 ----- 枚举、解决题目数据范围爆int问题
题目背景
disangan333 喜欢 disangan233,于是他也想让你帮他数数。
题目描述
传智专修学院有 nn 名同学,每个同学都有一个数字 a_nan。同时还知道一个常数 kk 。
如果有两名同学,第 ii 名同学和第 jj 名同学,满足 i<ji<j 且 a_i\times a_j\leq kai×aj≤k,那么这两名同学就被称为“和谐的一对”。请问这些同学中,有多少对“和谐的一对”呢?
对于所有数据,n \leq 10^3n≤103,a_i\leq 10^5ai≤105,k\leq 10^9k≤109。
输入格式
输入共 22 行。
第 11 行输入两个正整数 n,kn,k。
第 22 行输入 nn 个正整数 a_1\ldots a_na1…an。
输出格式
输出共 11 行 11 个整数,表示答案。
输入输出样例
输入 #1
5 5 1 2 3 4 5
输出 #1
4
说明/提示
样例解释
样例中,(1,2),(1,3),(1,4),(1,5)(1,2),(1,3),(1,4),(1,5) 这 44 对都是“和谐的一对”。
解决ai <= 10 5 两数相乘会爆int问题
1.数组开long long
#include <iostream> #include<iomanip> #include <math.h> #include <vector> #include <unordered_set> using namespace std; int main() { int n; long long k; int a; int res = 0; vector<long long> vec; cin >> n >> k; while (n--) { cin >> a; vec.push_back(a); } for (int i = 0; i < vec.size(); ++i) { for (int j = i + 1; j < vec.size(); ++j){ if(vec[i] * vec[j] <= k) res++; } } cout << res; return 0; }
2.乘法移项变成除法 (测试用例不会出现向下取整 导致错解的问题)
#include <iostream> #include<iomanip> #include <math.h> #include <vector> #include <unordered_set> using namespace std; int main() { int n; int k; int a; int res = 0; vector<int> vec; cin >> n >> k; while (n--) { cin >> a; vec.push_back(a); } for (int i = 0; i < vec.size(); ++i) { for (int j = i + 1; j < vec.size(); ++j){ if(vec[i] <= k / vec[j]) res++; } } cout << res; return 0; }
hello my world
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/16917827.html