ZOJ-3704 I am Nexus Master! 模拟
生活随笔
收集整理的這篇文章主要介紹了
ZOJ-3704 I am Nexus Master! 模拟
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:有一個(gè)判定用戶(hù)等級(jí)的系統(tǒng),現(xiàn)在不同的等級(jí)有不同的評(píng)價(jià)標(biāo)準(zhǔn),現(xiàn)給定一個(gè)用戶(hù)的歷史等級(jí)以及當(dāng)前最新的數(shù)據(jù),要求給出目前的等級(jí)。
解法:把不同的等級(jí)標(biāo)題映射到數(shù)字,然后或者歷史等級(jí)的標(biāo)號(hào),然后從大的往當(dāng)前標(biāo)號(hào)枚舉,查看是否升級(jí),如果升級(jí)則推出判定;否則從當(dāng)前等級(jí)往小的標(biāo)號(hào)枚舉,查看是否降級(jí),查看降級(jí)時(shí)只需要判定比率是否小于一個(gè)閥值即可,因?yàn)槠渌麧M(mǎn)足歷史等級(jí)的條件一定滿(mǎn)足標(biāo)號(hào)比它小的等級(jí),遇到不降級(jí)即退出判定。由于Peasant的判定于其他不太一樣,在開(kāi)始的時(shí)候就判定一下。
代碼如下:
#include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <map> #include <string> using namespace std;const double eps = 1e-8;struct User {char title[20];int weeks;double down, up, ratio;void read() {scanf("%s %d %lf %lf", title, &weeks, &down, &up);ratio = up / down;}void show() {puts(title);}void modify(); }u;int wk[10] = {0, 0, 4, 8, 15, 25, 40, 60, 80, 100}; int dn[10] = {0, 0, 50, 120, 300, 500, 750, 1024, 1536, 3072}; double ru[10] = {0, 0, 1.05, 1.55, 2.05, 2.55, 3.05, 3.55, 4.05, 4.55}; double rd[10] = {0, 0, 0.95, 1.45, 1.95, 2.45, 2.95, 3.45, 3.95, 4.45}; string str[10] = {"Peasant", "User", "Power_User", "Elite_User", "Crazy_User","Insane_User", "Veteran_User", "Extreme_User", "Ultimate_User", "Nexus_Master" }; map<string, int>mp;int init() {for (int i = 0; i < 10; ++i) {mp[str[i]] = i; } }int sign(double x, double y) {if (x - y > eps) return 1;else if (y - x > eps) return -1;else return 0; }bool judge_peasant() {if (sign(u.down, 50) >= 0 && sign(u.ratio, 0.4) < 0) return true;if (sign(u.down, 100) >= 0 && sign(u.ratio, 0.5) < 0) return true;if (sign(u.down, 200) >= 0 && sign(u.ratio, 0.6) < 0) return true;if (sign(u.down, 400) >= 0 && sign(u.ratio, 0.7) < 0) return true;if (sign(u.down, 800) >= 0 && sign(u.ratio, 0.8) < 0) return true;return false; }bool upclass(int x) {if (u.weeks >= wk[x] && sign(u.down, dn[x]) >= 0 && sign(u.ratio, ru[x]) >= 0) return true;return false; }bool dnclass(int x) {if (sign(u.ratio, rd[x]) < 0) return true;return false; }void User::modify() {if (judge_peasant()) {strcpy(title, str[0].c_str());return;}int rank = mp[title]; // 獲得當(dāng)前的排名for (int i = 9; i > rank; --i) { // 首先判定是否得到了更高的等級(jí) if (upclass(i)) {strcpy(title, str[i].c_str());return;}}for (int i = rank; i > 1; --i) {if (!dnclass(i)) { // 如果能夠保住這個(gè)等級(jí)則退出判定return; } else { // 否則下降一個(gè)等級(jí) strcpy(title, str[i-1].c_str());}} }/* 3 Crazy_User 5000 5000 50000000 Crazy_User 15 800.00 639.99 Veteran_User 45 1000.00 3000.00 Insane_User 45 1000.00 3000.00 */int main() {int T;init();for (scanf("%d", &T); T; T--) {u.read(), u.modify(), u.show();}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的ZOJ-3704 I am Nexus Master! 模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【配置属性】—Entity Framew
- 下一篇: Object C数据类型