P8834 [传智杯 #3 决赛] 序列 ----- 枚举、解决题目数据范围爆int问题

题目背景

disangan333 喜欢 disangan233,于是他也想让你帮他数数。

题目描述

传智专修学院有 nn 名同学,每个同学都有一个数字 a_nan。同时还知道一个常数 kk 。

如果有两名同学,第 ii 名同学和第 jj 名同学,满足 i<ji<j 且 a_i\times a_j\leq kai×ajk,那么这两名同学就被称为“和谐的一对”。请问这些同学中,有多少对“和谐的一对”呢?

对于所有数据,n \leq 10^3n103,a_i\leq 10^5ai105,k\leq 10^9k109。

输入格式

输入共 22 行。

第 11 行输入两个正整数 n,kn,k。

第 22 行输入 nn 个正整数 a_1\ldots a_na1an

输出格式

输出共 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;
}

 

 

 

posted @ 2022-11-23 11:53  slowlydance2me  阅读(342)  评论(0编辑  收藏  举报