P1102 A-B 数对
Posted zhangrunqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1102 A-B 数对相关的知识,希望对你有一定的参考价值。
P1102题库链接:https://www.luogu.org/problem/P1102
1.朴素 O(n^2) 得分76
将输入所有的数依次作为被减数,除此数外其他数依次作为减数,每当有一组的差为1时,方案数ans + 1
1 #include <cstdio> 2 using namespace std; 3 int main() 4 5 int n, c, s[200001], ans = 0; 6 scanf("%d%d", &n, &c); 7 for(int i = 0; i < n; ++i) 8 scanf("%d", &s[i]); 9 for(int i = 0; i < n; ++i) 10 11 for(int j = 0; j < n; ++j) 12 13 if(i == j) continue; 14 if(s[i] - s[j] == c) ++ans; 15 16 17 printf("%d\n", ans); 18 return 0; 19
2.桶优化 O(n) 得分84
输入一个数,对应的桶增加,因为A - B = C -> A - C = B,枚举每一种A的可能值,从而用A - C求出B,若A,B存在(即桶不为0),则方案数ans += t[A] * t[B]
1 #include <cstdio> 2 using namespace std; 3 int main() 4 5 int n, c, ans = 0, t[10000001] = 0; 6 scanf("%d%d", &n, &c); 7 for(int i = 0; i < n; ++i) 8 9 int x; 10 scanf("%d", &x); 11 ++t[x]; 12 13 for(int i = c; i < 10000001; ++i) 14 if(t[i] != 0 && t[i - c] != 0) 15 ans += t[i] * t[i - c]; 16 printf("%d\n", ans); 17 return 0; 18
3.map优化 AC
1 #include <cstdio> 2 #include <map> 3 using namespace std; 4 long long a[200001]; 5 map<long long, long long> m; 6 int main() 7 8 long long n, c, ans = 0; 9 scanf("%lld%lld", &n, &c); 10 for(int i = 0; i < n; ++i) 11 12 scanf("%lld", &a[i]); 13 ++m[a[i]]; 14 a[i] -= c; 15 16 for(int i = 0; i < n; ++i) 17 ans += m[a[i]]; 18 printf("%lld\n", ans); 19 return 0; 20
以上是关于P1102 A-B 数对的主要内容,如果未能解决你的问题,请参考以下文章