codeforces A. Group of Students 解题报告

题目链接:http://codeforces.com/problemset/problem/357/A

题目意思:将一堆人分成两组:beginners 和 intermediate coders 。每一个人都有一个point,给出每一个point里的总人数(Ci 个人有分数 i )和 x,y,需要找出划分为两组后,每一个组的人数(假设为a,b)符合 x <=  a  <= y 并且 x<= b <= y 的条件,输出这a个人是小于哪个point的,这个point还应该满足另一组的b个人都不小于它。当不能找到这个point符合条件时,输出0.

     直接模拟即可。不断累加读入的人数,当这个人数 >= x时,就验证(总人数 - 这个从前往后依次累加的人数)是否也满足 <= y这个条件,一旦发现满足,就得到答案了,此时输出对应累加的人数中最后一个人所拥有的point。这里用到结构体来处理。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 
 6 const int maxn = 1e4 + 10;
 7 
 8 struct students
 9 {
10     int num;       // 每一个分数所对应的人数
11     int point;
12 } exa[maxn];
13 
14 int main()
15 {
16     int x, y, m, i, flag, sum1, sum2, sum;
17     while (scanf("%d", &m) != EOF)
18     {
19         sum = 0;
20         for (i = 1; i <= m; i++)
21         {
22             scanf("%d", &exa[i].num);
23             sum += exa[i].num;
24             exa[i].point = i;
25         }
26         scanf("%d%d", &x, &y);
27         sum1 = 0;
28         flag = 0;
29         for (i = 1; i <= m; i++)
30         {
31             sum1 += exa[i].num;   // 划分后第一个组的人数
32             sum2 = sum - sum1;   // 划分后第二个组的人数
33             if ((sum1 >= x && sum1 <= y) && (sum2 >= x && sum2 <= y))
34             {
35                 flag = 1;   // 找到一个解的标志
36                 break;
37             }
38         }
39         if (flag)
40             printf("%d
", exa[i+1].point);
41         else
42             printf("0
");
43     }
44     return 0;
45 }
原文地址:https://www.cnblogs.com/windysai/p/3373419.html