哈理工OJ 1710 a + b = c(尺取法)
2017-04-12 20:59
141 查看
题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1710
a + b = c
Time Limit: 2000 MS Memory Limit: 65536 K
Total Submit: 307(108 users) Total Accepted: 100(82 users) Rating: Special Judge: No
Description
有A、 B、 C 三个集合的,其中a∈A, b ∈ B, c ∈ C,求有多少种方式使得a + b = c。
Input
有多组测试数据,请处理到文件结束。
对于每组测试数据,有三行:
第一行为A集合的描述,第一个数为n,表示A集合有n个数,接下来有n个整数a1~an。
第二行为B集合,第三行为C集合,表示含义参考第一行。
每个集合中的数两两不相等。
1<=n<=5000,|ai| <= 1 000 000 000
Output
对于每组测试数据,输出一行,包含一个整数,表示有多少种组合方式。
Sample Input
3 -10 4 -6
3 -10 3 -1
3 3 -4 -6
3 -8 -9 -4
3 9 -10 2
3 -8 -7 5
3 -4 -6 -2
3 9 -9 -2
3 3 -13 -4
Sample Output
2
2
3
【思路分析】首先暴力求的话n*n*n是超时的,所以我们就得换个思路,如果可以降一层for的话时间复杂度是完全足够的。所以我们先对序列进行排序,然后用尺取法去解这道题。
【AC代码】
a + b = c
Time Limit: 2000 MS Memory Limit: 65536 K
Total Submit: 307(108 users) Total Accepted: 100(82 users) Rating: Special Judge: No
Description
有A、 B、 C 三个集合的,其中a∈A, b ∈ B, c ∈ C,求有多少种方式使得a + b = c。
Input
有多组测试数据,请处理到文件结束。
对于每组测试数据,有三行:
第一行为A集合的描述,第一个数为n,表示A集合有n个数,接下来有n个整数a1~an。
第二行为B集合,第三行为C集合,表示含义参考第一行。
每个集合中的数两两不相等。
1<=n<=5000,|ai| <= 1 000 000 000
Output
对于每组测试数据,输出一行,包含一个整数,表示有多少种组合方式。
Sample Input
3 -10 4 -6
3 -10 3 -1
3 3 -4 -6
3 -8 -9 -4
3 9 -10 2
3 -8 -7 5
3 -4 -6 -2
3 9 -9 -2
3 3 -13 -4
Sample Output
2
2
3
【思路分析】首先暴力求的话n*n*n是超时的,所以我们就得换个思路,如果可以降一层for的话时间复杂度是完全足够的。所以我们先对序列进行排序,然后用尺取法去解这道题。
【AC代码】
#include<cstdio> #include<cstring> #include<map> #include<cmath> #include<algorithm> using namespace std; int a[5005],b[5005],c[5005]; int n1,n2,n3; int main() { while(~scanf("%d",&n1)) { for(int i=1;i<=n1;i++) { scanf("%d",&a[i]); } scanf("%d",&n2); for(int i=1;i<=n2;i++) { scanf("%d",&b[i]); } scanf("%d",&n3); for(int i=1;i<=n3;i++) { scanf("%d",&c[i]); } int sum=0; sort(a+1,a+1+n1); sort(b+1,b+1+n2); for(int i=1;i<=n3;i++) { for(int j=1,k=n2;j<=n1&&k>=1;) { if(a[j]+b[k]>c[i]) { k--; } else if(a[j]+b[k]==c[i]) { sum++; j++; k--; } else { j++; } } } printf("%d\n",sum); } return 0; }
相关文章推荐
- hrbust 1326 哈理工oj 1326 Leyni的国家【DFS+邻接表建图】
- hrbust 1853 哈理工oj 1853 幼稚园的数学Ⅰ【Biginteger】
- 哈理工 oj——神奇的进制转换
- hrbust/哈理工oj 1178 分数加减【水题】
- 哈理工oj 1306-再遇攻击解题报告
- 哈理工OJ 1108 店长推荐
- 哈理工OJ1684——最大连续和
- 哈理工oj 1001 Probability One
- 哈理工OJ 1151 追求(斐波那契变形【思维题目】)
- 哈理工OJ1315-火影忍者之~大战之后【贪心】
- 哈理工OJ1621_迷宫问题II【BFS+优先队列】
- 哈理工OJ 1248 The kth great number(线段树)
- 【哈理工OJ 750题纪念!】Hrbust 2200 Escaping【建图+最大流-------Dinic】
- 哈理工OJ 2224 逆序对问题(利用归并排序求逆序数对数)
- 哈理工OJ 1333GG的关心(01背包)
- Hrbust 2051 Mountain Subsequences【dp+思维】【哈理工OJ 800题纪念】
- 哈理工OJ2252 世界 (完全背包变形)
- hrbust 哈理工oj 2011 一等队形【dp】
- hrbust 哈理工oj 网线【MST+Prim】
- hrbust 哈理工oj 1613 迷宫问题 bfs