今日无聊,找个洛谷题做做,本人很菜,于是挑中了她————
题目描述
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
好吧,题目是这样的:给出一串数以及一个数字 CC,要求计算出所有 A - B = CA−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个整数 N, CN,C。
第二行,NN 个整数,作为要求处理的那串数。
输出格式
一行,表示该串数中包含的满足 A - B = CA−B=C 的数对的个数。
输入输出样例
输入
4 11 1 2 3
输出
3
好家伙,这不就是leetcode经典题目两数之和的变形吗!!(然而并不是)
飞速写完代码
#include <unordered_map>#include <iostream>#include <vector>using namespace std;unordered_map<int,int> m;vector<int> a;int main(){long long int N,C;long long int x;scanf("%lld%lld",&N,&C);int count=0;for(int i=0;i<N;i++){scanf("%lld",&x);a.push_back(x);}for(int i=0;i<N;i++){m[a[i]]=i;}for(int i=0;i<N;i++){auto it=m.find(a[i]+C);if(it!=m.end()){ count++;}}printf("%d
",count);}
然而怎么也过不了.....
仔细思索,题目其实并不一样(不同位置的数字一样的数对算不同的数对)。
故按以上做法必定会少一些数据
所以
#include <bits/stdc++.h>//万能头文件,不用调用头文件<map> using namespace std;int main(){long long n,c,co=0; //要开long long,否则会 WA 一个数据点 cin>>n>>c;int a[n+1];map<int,int> b;//键值和映照数据都是 int 类型 for(int i=1; i<=n; i++){ cin>>a[i]; b[a[i]]++;}for(int i=1; i<=n; i++) co+=b[a[i]+c];//反向思维,枚举 B+Ccout<<co<<endl;return 0;}
完毕,又浪费了好长时间。