• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

CodeForces 474B E(Contest #1)

题意:
  给你一个数n,代表n段区间,接下来有n个数(a1,a2,...an)代表每段区间的长度,第一段区间为[1,a1],第二段区间为[a1+1,a1+a2],...第i段区间为[ai-1+1,ai-1+ai]
  接着输入一个整数m,之后有m个数,问你这m个数,每个数所在的区间编号.

 

分析:
  可以采用计数排序,建立一个数组,将第i段区间[ai-1+1,ai-1+ai]赋值为i,这样输入一个数很快就可以输出它所在的区间编号;
  因为区间中的值是有序的,所以还可以采用二分查找法.





代码如下:

 1 //方法一:
 2 
 3 
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <fstream>
 8 #include <ctime>
 9 #include <cmath>
10 #include <cstdlib>
11 #include <algorithm>
12 #include <set>
13 #include <map>
14 #include <list>
15 #include <stack>
16 #include <queue>
17 #include <iterator>
18 #include <vector>
19 
20 using namespace std;
21 
22 #define LL long long
23 #define INF 0x3f3f3f3f
24 #define MON 1000000007
25 #define MAXN 10000010
26 #define MAXM 1000010
27 
28 const int maxn = 1000005;
29 int a[maxn];
30 
31 int main()
32 {
33     int n, m;
34     while(scanf("%d", &n)==1)
35     {
36         memset(a, 0, sizeof(a));
37         int i, j;
38         int cnt = 1;
39         int sum = 0;
40         int pos = 0;
41         for(i = 1; i <= n; i++ )
42         {
43             pos++;
44             int x;
45             scanf("%d", &x);
46             sum += x;   //sum的最大值为1e6超过了n的最大值,所以数组a的长度应该为1e6,不然会RE
47             for(j = cnt; j <= sum; j++ )
48                 a[j] = pos;
49             cnt = sum+1;
50         }
51         scanf("%d", &m);
52         for(i = 0; i < m; i++ )
53         {
54             int y;
55             scanf("%d", &y);
56             printf("%d\n", a[y]);
57         }
58     }
59 
60     return 0;
61 }

 


 
 1 //方法二:
 2 
 3 16:52:262016-07-25
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <fstream>
 8 #include <ctime>
 9 #include <cmath>
10 #include <cstdlib>
11 #include <algorithm>
12 #include <set>
13 #include <map>
14 #include <list>
15 #include <stack>
16 #include <queue>
17 #include <iterator>
18 #include <vector>
19 
20 using namespace std;
21 
22 #define LL long long
23 #define INF 0x3f3f3f3f
24 #define MON 1000000007
25 #define MAXN 10000010
26 #define MAXM 1000010
27 
28 const int maxn = 100005;
29 int a[maxn], b[maxn];
30 
31 int lower_bound(int *A, int x, int y, int v)
32 {
33     int mid;
34     while(x < y)
35     {
36         mid = (y-x)/2 + x;
37         if(v <= A[mid])
38             y = mid;
39         else
40             x = mid+1;
41     }
42 
43     return x;
44 }
45 
46 int main()
47 {
48     int n, m;
49     while(scanf("%d", &n)==1)
50     {
51         memset(a, 0, sizeof(a));
52         int i;
53         int sum = 0;
54         int c = 1;
55         for(i = 0; i < n; i++ )
56         {
57             int x;
58             scanf("%d", &x);
59             sum += x;
60             a[c++] = sum;
61         }
62         scanf("%d", &m);
63         for(i = 0; i < m; i++ )
64         {
65             int y;
66             scanf("%d", &y);
67             int cnt = lower_bound(a, 0, c, y);
68             printf("%d\n", cnt);
69         }
70     }
71 
72     return 0;
73 }

 

posted on 2016-07-25 16:53  tony-cao  阅读(160)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3