zoukankan      html  css  js  c++  java
  • [Swust OJ 603]--吃饺子大王

     
    Time limit(ms): 1000      Memory limit(kb): 65535
     
    同学们还记得我们班大一时举行的吃饺子大赛这个有趣的活动吧,相信这次活动会给软件0604班的同学们留下一生的美好回忆。 
    现在,作为大赛的评委henry,遇到了一个难题,就是他在统计一个小组同学每个人吃饺子数量的时候,这个小组的同学并没有明确的给出自己吃饺子的准确数量,估计是自己吃的太多了数不清了^_^,他们只是给出了与同一组其他组员吃饺子数量上的关系,为了简单起见,只有‘+’‘-’两种数量上的关系。 
    Description
    第一行输入的是该小组成员的数量N(2到10之间),即分别编号为1到N。接下来2到N行给出的是编号为2到N的同学对自己吃饺子数量上的描述。如第二行的“+,1,3”表示的是编号为2的同学比编号为1的同学多吃了3个饺子。由于编号为1同学的RP问题^_^,因此每组编号为1的同学都没有发言权。
    Input
    现在要求你根据组员的描述情况求出该组内吃饺子最多同学的编号,假设通过这些描述一定能求出该小组内吃饺子最多的成员编号。如果一个组内有多个同学吃饺子数量最大且相同,那么按编号从小到大的顺序输出即可,每个编号间有一个空格。
    Output
    1
    2
    3
    4
    5
    6
    7
    6
    + 3 1
    + 1 2
    - 2 1
    + 3 1
    + 1 1
     
    Sample Input
    1
    2 5
    Sample Output
    Hint
     
    解题思路:直解假定第一个的数量然后按照条件叠加就是,但是逻辑关系有点复杂,写代码差点把自己搞晕~~~
    代码如下:
     1 #include<iostream>
     2 using namespace std;
     3 #define inf -0x3f3f3f3f
     4 struct node
     5 {
     6     int left, right, cur, num;
     7     char ch;
     8 }date[11];
     9 int main()
    10 {
    11     int n, i, j;
    12     while (cin >> n)
    13     {
    14         int max = inf, k = 0;
    15         date[1].num = 0, date[1].right = 1;
    16         for (i = 2; i <= n; i++)
    17         {
    18             cin >> date[i].ch >> date[i].left >> date[i].cur;
    19             date[i].right = i;
    20             date[i].num = inf;
    21         }
    22         for (i = 1; i <= n; i++)
    23         {
    24             for (j = 1; j <= n; j++)
    25             {
    26                 if (date[date[j].right].num != inf&&date[date[j].left].num == inf)
    27                 {
    28                     if (date[date[j].right].ch == '+')
    29                         date[date[j].left].num = date[date[j].right].num - date[date[j].right].cur;
    30                     else
    31                         date[date[j].left].num = date[date[j].right].num + date[date[j].right].cur;
    32                 }
    33                 else if (date[date[j].right].num == inf&&date[date[j].left].num != inf)
    34                 {
    35                     if (date[date[j].right].ch == '+')
    36                         date[date[j].right].num = date[date[j].left].num + date[date[j].right].cur;
    37                     else
    38                         date[date[j].right].num = date[date[j].left].num - date[date[j].right].cur;
    39                 }
    40                 if (date[j].num > max)
    41                     max = date[j].num;
    42             }
    43         }
    44         for (i = 1; i <= n; i++)
    45         {
    46             if (date[i].num == max)
    47             {
    48                 if (k++) cout << ' ';
    49                 cout << i;
    50             }
    51         }
    52         cout << endl;
    53     }
    54     return 0;
    55 }
    View Code

    然后后来又想到了一点优化,先把输入数据按照多余对象(比谁多)排序,

    给每一组数据加上当前成员编号,然后按成员编号,直接按关系式相加就是,具体的看代码~~

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 using namespace std;
     5 struct node{
     6     int no, ptr, x;
     7     char v;
     8     bool operator<(const node &tmp)const{
     9         if (ptr != tmp.ptr)
    10             return ptr < tmp.ptr;
    11         return x < tmp.x;
    12     }
    13 }ss[11];
    14 int main(){
    15     int n, mpt[11], i, k = 0, maxn = -0x7ffffff;
    16     memset(mpt, 0, sizeof(mpt));
    17     cin >> n;
    18     for (i = 1; i < n; i++){
    19         cin >> ss[i].v >> ss[i].ptr >> ss[i].x;
    20         ss[i].no = i;
    21     }
    22     sort(ss + 1, ss + n);
    23     for (i = 1; i < n; i++){
    24         switch (ss[i].v){
    25         case '+':mpt[ss[i].no] = mpt[ss[i].ptr - 1] + ss[i].x; break;
    26         case '-':mpt[ss[i].no] = mpt[ss[i].ptr - 1] - ss[i].x; break;
    27         }
    28     }
    29     for (i = 0; i < n; i++)
    30         maxn = maxn>mpt[i] ? maxn : mpt[i];
    31     for (i = 0; i < n; i++){
    32         if (mpt[i] == maxn){
    33             if (k++) cout << ' ';
    34             cout << i + 1;
    35         }
    36     }
    37     cout << endl;
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    LED自动同步时钟(LED电子时钟系统)京准电子
    电力北斗对时装置(北斗时钟同步系统)详细介绍
    京准时间同步系统(NTP网络同步时钟)概述
    京准:NTP时钟服务器(NTP时钟服务器)研究分析
    医院时钟系统(子母钟系统)设计组成架构
    GPS校时器(北斗授时设备)助力政务云建设
    三大免费开源的php语言cms系统 用好它们让你一天建好一个网站
    想精通正则表达式 这几个正则表达式学习资料及工具你必须有!
    零基础建站如何配置PHP运行环境 几种服务器环境配置的选择和方法
    php代码如何加域名授权?开源php项目如何保护版权 商业授权?
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4572543.html
Copyright © 2011-2022 走看看