[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

 

你可能感兴趣的:(OJ)