P1102 A-B 数对

P1102题库链接:https://www.luogu.org/problem/P1102

难度:普及-

算法标签:模拟,数论,排序,HASH,概率论,二分查找

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[10000000] = {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 <= 10000000; ++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 }

转载于:https://www.cnblogs.com/ZhangRunqi/p/11286011.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值