Codeforces Beta Round #81 A Transmigration
在魔界战记中有一个设定叫做转生,当一个人物转生时,会保留之前的技能,但是技能等级需要乘以一个系数 k ,如果技能等级小于100,将会在转生之后失去该技能。
转生之后,会学到一些新技能。这些新技能附加的等级为0。
现在给你 n 个已有的技能,m个新技能和系数k,请按字典序输出转生之后的技能总数、技能名称和等级。
这题最纠结蛋疼的地方就是不能使用强制类型转换和系统函数floor()。
从样例输出来看,技能等级是向下取整的(350*0.75=262.5)。但是如果使用强制类型转换或者是用floor()函数的话,会有一组奇葩的数据卡住(floor(8700*0.94) = (int)(8700*0.94) = 8177,我也不知道谁出的这么操蛋好的数据,反正就是这里卡死了。这里的结果应该为8178)。
然后其他的很简单了,将已有技能读取之后,等级小于100的直接去掉,转换之后小于100的变成0。然后开始读取新技能,读取一个遍历一次看是否存在这个技能(最多才20 * 20,不超时),存在继续,不存在就加入这个新技能。最后按照字典序排序输出就Ok了。
附AC代码,手残勿喷:
1: #include <cstdio>
2: #include <cstdlib>
3: #include <cstring>
4: #include <cmath>
5: #include <algorithm>
6: #include <iostream>
7: #include <string>
8: #include <map>
9: using namespace std;
10: 11: class Skill
12: {13: public:
14: int lv;
15: string name; 16: Skill() 17: { 18: name.clear(); 19: lv = 0; 20: }21: bool operator < (const Skill &tmp) const
22: {23: return name < tmp.name;
24: } 25: }skill[59]; 26: 27: int Floor(double a)
28: {29: int res = a;
30: if (a - res >= 0.999999)
31: return (res + 1);
32: return res;
33: } 34: 35: string tmp;36: int tlv;
37: 38: int main()
39: {40: int n, m, all = 0;
41: double k;
42: while(cin >> n >> m >> k)
43: { 44: all = 0;45: for (int i = 1; i <= n; i++)
46: {47: bool flag = 1;
48: cin >> tmp >> tlv;49: for (int j = 1; j <= all && flag; j++)
50: if (skill[j].name == tmp)
51: flag = 0;52: if (flag)
53: {54: if (Floor(tlv * k) >= 100)
55: { 56: all += 1; 57: skill[all].name = tmp; 58: skill[all].lv = Floor(tlv * k); 59: } 60: } 61: }62: for (int i = 1; i <= m; i++)
63: {64: bool flag = 1;
65: cin >> tmp;66: for (int j = 1; j <= all && flag; j++)
67: if (skill[j].name == tmp)
68: flag = 0;69: if (flag)
70: { 71: all += 1; 72: skill[all].name = tmp; 73: skill[all].lv = 0; 74: } 75: } 76: cout << all << endl; 77: sort(skill+1, skill+all+1);78: for (int i = 1; i <= all; i++)
79: {80: cout << skill[i].name << " " << skill[i].lv << endl;
81: skill[i].name.clear(); 82: skill[i].lv = 0; 83: } 84: }85: return 0;
86: }
浙公网安备 33010602011771号