在 absi2011 的帮派里,死号偏多。现在 absi2011 和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。
目前帮派内共最多有一位帮主,两位副帮主,两位护法,四位长老,七位堂主,二十五名精英,帮众若干。
现在 absi2011 要对帮派内几乎所有人的职位全部调整一番。他发现这是个很难的事情。于是要求你帮他调整。
他给你每个人的以下数据:
他的名字(长度不会超过 30),他的原来职位,他的帮贡,他的等级。
他要给帮贡最多的护法的职位,其次长老,以此类推。
可是,乐斗的显示并不按帮贡排序而按职位和等级排序。
他要你求出最后乐斗显示的列表(在他调整过职位后):职位第一关键字,等级第二关键字。
注意:absi2011 无权调整帮主、副帮主的职位,包括他自己的(这不是废话么..)
他按原来的顺序给你(所以,等级相同的,原来靠前的现在也要靠前,因为经验高低的原因,但此处为了简单点省去经验。)
第一行一个正整数 n,表示星月家园内帮友的人数。
下面 n 行每行两个字符串两个整数,表示每个人的名字、职位、帮贡、等级。
一共输出 n行,每行包括排序后乐斗显示的名字、职位、等级。
分析:
先按照帮贡排序,分出职务,在根据职务相同的,按照等级排序,等级一样,按输入顺序排序。
代码:
- #include
- using namespace std;
- struct bangpai
- {
- string name;
- string zhiwu;
- int gongxian;
- int dengji;
- int xh;
- }a[111];
- int b(string a) {
- if (a == "BangZhu") return 0;
- if (a == "FuBangZhu") return 1;
- if (a == "HuFa") return 2;
- if (a == "ZhangLao") return 3;
- if (a == "TangZhu") return 4;
- if (a == "JingYing") return 5;
- if (a == "BangZhong") return 6;
- }
- int px1(bangpai x, bangpai y) {//贡献排序
- if (x.gongxian == y.gongxian)//贡献一样,按序号排序,不一样,按贡献排序
- return x.xh < y.xh;
- else
- return x.gongxian > y.gongxian;
- }
- int px2(bangpai x, bangpai y) {//等级排序
- if (x.zhiwu == y.zhiwu) {
- if (x.dengji == y.dengji)//职务一样,等级相同,按序号排序,等级不一样,按等级排序
- return x.xh < y.xh;
- else
- return x.dengji > y.dengji;
- }
- else
- return b(x.zhiwu) < b(y.zhiwu);//职务不一样的,按职务大小排序
- }
- int main() {
- int n,t,z,p;
- cin >> n;
- for (int i = 1; i <= n; i++) {
- cin >> a[i].name >> a[i].zhiwu >> a[i].gongxian >> a[i].dengji;
- a[i].xh = i;
- }
- sort(a + 4, a + 1 + n, px1);
- for (int i = 4; i <= n; i++) {
- if (i == 4 || i == 5) a[i].zhiwu = "HuFa";
- else if (i >= 6 && i <= 9) a[i].zhiwu = "ZhangLao";
- else if (i >= 10 && i <= 16) a[i].zhiwu = "TangZhu";
- else if (i >= 17 && i <= 41) a[i].zhiwu = "JingYing";
- else a[i].zhiwu = "BangZhong";
- }
- sort(a + 4, a + 1 + n, px2);
- for (int i = 1; i <= n; i++) {
- cout << a[i].name << " " << a[i].zhiwu << " " << a[i].dengji << endl;
- }
- return 0;
- }
-