[Swust OJ 603]--吃饺子大王
Time limit(ms): 1000 Memory limit(kb): 65535
同学们还记得我们班大一时举行的吃饺子大赛这个有趣的活动吧,相信这次活动会给软件0604班的同学们留下一生的美好回忆。
现在,作为大赛的评委henry,遇到了一个难题,就是他在统计一个小组同学每个人吃饺子数量的时候,这个小组的同学并没有明确的给出自己吃饺子的准确数量,估计是自己吃的太多了数不清了^_^,他们只是给出了与同一组其他组员吃饺子数量上的关系,为了简单起见,只有‘+’‘-’两种数量上的关系。
现在,作为大赛的评委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
解题思路:直解假定第一个的数量然后按照条件叠加就是,但是逻辑关系有点复杂,写代码差点把自己搞晕~~~
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
然后后来又想到了一点优化,先把输入数据按照多余对象(比谁多)排序,
给每一组数据加上当前成员编号,然后按成员编号,直接按关系式相加就是,具体的看代码~~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
如果这是你所爱的,就不要让自己后悔~~~