您的位置:首页 > 其它

[Swust OJ 603]--吃饺子大王

2015-06-12 20:45 288 查看
题目链接:http://acm.swust.edu.cn/problem/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

解题思路:直解假定第一个的数量然后按照条件叠加就是,但是逻辑关系有点复杂,写代码差点把自己搞晕~~~
代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node{
int no, ptr, x;
char v;
bool operator<(const node &tmp)const{
if (ptr != tmp.ptr)
return ptr < tmp.ptr;
return x < tmp.x;
}
}ss[11];
int main(){
int n, mpt[11], i, k = 0, maxn = -0x7ffffff;
memset(mpt, 0, sizeof(mpt));
cin >> n;
for (i = 1; i < n; i++){
cin >> ss[i].v >> ss[i].ptr >> ss[i].x;
ss[i].no = i;
}
sort(ss + 1, ss + n);
for (i = 1; i < n; i++){
switch (ss[i].v){
case '+':mpt[ss[i].no] = mpt[ss[i].ptr - 1] + ss[i].x; break;
case '-':mpt[ss[i].no] = mpt[ss[i].ptr - 1] - ss[i].x; break;
}
}
for (i = 0; i < n; i++)
maxn = maxn>mpt[i] ? maxn : mpt[i];
for (i = 0; i < n; i++){
if (mpt[i] == maxn){
if (k++) cout << ' ';
cout << i + 1;
}
}
cout << endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: