細節較多,自己寫的第一份半殘品,未能AC,后參考了劉老師的代碼,寫出了第二份的代碼,經過多次修改后總算AC,然而後果也很嚴重,導致代碼和劉老師極其相似,這也是我不喜歡看了參考代碼后再自己寫的緣故。

祇爲怕自己忘記,所以寫博客留檔

1:一開始沒看題,就看劉老師的描述,我以爲輸入的選手信息沒有規定格式,所以第一份寫了找第一個數字的函數來確定名字與成績的分界綫,后看(翻譯)了題目才知道對輸入是有規範的,并且udebug的隨機數據的名字用P+數字描述,讓我寫的讀取信息的一系列操作作廢了;

2:即使看描述,也把劉老師說的很多細節忽略了,後來看到書上都有講,真是弱智了:

No1,對選手的排名,是至少有兩名獲得獎金的并列情況才加'T';

No2,輸出的選手信息不包括沒晉級的,一開始我把全部選手都輸出了。。。;

No3,獎金是順延的,并不是第二名打星,第三名還是拿第三名的獎金,而是第三名拿第二名的獎金;

No4,排序時候,若總分相同,則按照名字的字典序排序;

3:題目在獎金上面的測試數據不需要+eps來解決精度問題,反而隨機數據裏面會出現精度問題;

4:udebug隨機數據不符合劉老師的描述,所以劉老師的代碼不能跑隨機數據;

自己的和劉老師的代碼都貼出來==兩個雖然長得很像

我的代碼:

 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cctype>
#include<utility>
#include<cassert>
#include<cmath>
using namespace std; #define FOR(i,n) for(int i=0;i<(n);i++) const int maxn = ;
const int n_cut = ;
double eps = 1e-;
double money[n_cut], totle;
int n; struct Lan {
char name[];
int rd[], sc36, sc72, dq;
int rnds;
bool star; Lan operator =(string &s) {
FOR(i, ) name[i] = s[i];
name[] = ;
star = false;
if (strchr(name,'*'))
star = true;
sc36 = sc72 = dq = rnds = ;
memset(rd, , sizeof(rd));
FOR(i, ) {
char t[];
FOR(j, ) t[j] = s[ + i * + j];
t[] = '\0';
if (!(sscanf(t, "%d", &rd[i]))) {
dq = -;
rnds = i;
if (i < )
sc36 = -;
break;
}
else {
sc72 += rd[i];
if (i < )
sc36 += rd[i];
}
}
return *this;
}
Lan() {
memset(name, , sizeof(name));
FOR(i, ) rd[i] = ;
sc36 = sc72 = dq =rnds= ;
star = false;
}
}lan[maxn]; void print_result() {
printf("Player Name Place RD1 RD2 RD3 RD4 TOTAL Money Won\n-----------------------------------------------------------------------\n");
int i = , cnt = ;
while (i < n) {
if (lan[i].dq) {
printf("%s ", lan[i].name);
FOR(k, lan[i].rnds)
printf("%-5d", lan[i].rd[k]);
FOR(j, - lan[i].rnds)
printf(" ");
printf("DQ\n");
i++;
continue;
}
int j = i, m = , top = i + ;
double tot = 0.0;
bool have_money = false;
while (j < n&&lan[i].sc72 == lan[j].sc72) {
if (!lan[j].star) {
m++;
if (cnt < n_cut) {
tot += money[cnt++];
have_money = true;
}
}
j++;
}
double totmoney = totle*tot / m;
while (i < j) {
printf("%s ", lan[i].name);
char t[];
sprintf(t, "%d%c", top, (m> && have_money&& !lan[i].star) ? 'T' : ' ');
printf("%-10s", t);
FOR(k, )
printf("%-5d", lan[i].rd[k]);
if (!lan[i].star&&have_money) {
printf("%-10d", lan[i].sc72);
printf("$%9.2f\n", totmoney / 100.0);
}
else
printf("%d\n", lan[i].sc72);
i++;
}
}
} int main() {
int T;
cin >> T;
while (T--) {
cin >> totle;
FOR(i, ) {
cin >> money[i];
}
cin >> n;
assert(n <= );
string s;
getline(cin, s);
FOR(i, n) {
getline(cin, s);
lan[i] = s;
}
sort(lan, lan + n, [](const Lan& t1, const Lan& t2) {
if (t1.sc36 < && t2.sc36 < ) return false;
if (t1.sc36 < ) return false;
if (t2.sc36 < ) return true;
return t1.sc36 < t2.sc36; });
//assert(lan[n_cut-1].sc36 >= 0);
int len = ;
for (; len < n;len++)
if (lan[len].sc36<)
break;
if (len <= n_cut)
n = len;
else
for (int i = n_cut-; i < n; i++)
if (i == n - || lan[i].sc36 != lan[i + ].sc36||lan[i].sc36<) {
n = i + ;
break;
}
sort(lan, lan + n, [](const Lan& t1, const Lan& t2) {
if (t1.dq&&t2.dq) {
if (t1.rnds != t2.rnds)return t1.rnds>t2.rnds;
if(t1.sc72!=t2.sc72) return t1.sc72 < t2.sc72;
return strcmp(t1.name,t2.name) < ;
}
if (t1.dq) return false;
if (t2.dq) return true;
if (t1.sc72 != t2.sc72) return t1.sc72 < t2.sc72;
return strcmp(t1.name,t2.name)< ; });
print_result();
if(T) putchar('\n');
}
return ;
}

劉老師的代碼:

 // UVa207 PGA Tour Prize Money
// Rujia Liu
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cassert>
using namespace std; #define REP(i,n) for(int i = 0; i < (n); i++) const int maxn = ;
const int n_cut = ; struct Player {
char name[];
int amateur;
int sc[];
int sc36, sc72, dq;
int rnds;
} player[maxn]; int n;
double purse, p[n_cut]; bool cmp1(const Player& p1, const Player& p2) {
if(p1.sc36 < && p2.sc36 < ) return false; // equal
if(p1.sc36 < ) return false; // p2 smaller
if(p2.sc36 < ) return true; // p1 smaller
return p1.sc36 < p2.sc36;
} bool cmp2(const Player& p1, const Player& p2) {
if(p1.dq && p2.dq) {
if(p1.rnds != p2.rnds) return p2.rnds < p1.rnds;
if(p1.sc72 != p2.sc72) return p1.sc72 < p2.sc72;
return strcmp(p1.name, p2.name) < ;
}
if(p1.dq) return false;
if(p2.dq) return true;
if(p1.sc72 != p2.sc72) return p1.sc72 < p2.sc72;
return strcmp(p1.name, p2.name) < ;
} void print_result() {
printf("Player Name Place RD1 RD2");
printf(" RD3 RD4 TOTAL Money Won\n");
printf("---------------------------------------");
printf("--------------------------------\n"); int i = , pos = ;
while(i < n) {
if(player[i].dq) {
printf("%s ",player[i].name);
REP(j,player[i].rnds) printf("%-5d", player[i].sc[j]);
REP(j,-player[i].rnds) printf(" ");
printf("DQ\n");
i++;
continue;
} int j = i;
int m = ; // number of tied players
bool have_money = false;
double tot = 0.0; // total pooled money
while(j < n && player[i].sc72 == player[j].sc72) {
if(!player[j].amateur) {
m++;
if(pos < n_cut) {
have_money = true; // yeah! they still have money
tot += p[pos++];
}
}
j++;
} // print player [i,j) together because they have the same rank
int rank = i + ; // rank of all these m players
double amount = purse * tot / m; // if m=0, amount will be nan but we don't use it in that case :)
while(i < j) {
printf("%s ", player[i].name);
char t[];
sprintf(t, "%d%c", rank, m > && have_money && !player[i].amateur ? 'T' : ' ');
printf("%-10s", t);
REP(e,) printf("%-5d", player[i].sc[e]); // with prize
if(!player[i].amateur && have_money) {
printf("%-10d", player[i].sc72);
printf("$%9.2lf\n", amount / 100.0);
} else
printf("%d\n", player[i].sc72);
i++;
}
}
} int main() {
int T;
char s[]; gets(s);
sscanf(s,"%d",&T);
while(T--) {
gets(s); // empty line // prize
gets(s);
sscanf(s,"%lf", &purse);
REP(i,n_cut) {
gets(s);
sscanf(s, "%lf", &p[i]);
} // players
gets(s);
sscanf(s, "%d", &n);
assert(n <= );
REP(k,n) {
// read a 32-character line
gets(s); // player name
strncpy(player[k].name, s, );
player[k].name[] = ;
player[k].amateur = ;
if(strchr(player[k].name, '*')) {
player[k].amateur = ;
} // scores
player[k].sc36 = player[k].sc72 = player[k].dq=;
memset(player[k].sc, -, sizeof(player[k].sc));
REP(i,) {
// raw score
char t[];
REP(j,) t[j] = s[ + i* + j]; t[] = '\0'; // parse
if(!sscanf(t,"%d", &player[k].sc[i])) {
// DQ!
player[k].rnds = i;
player[k].dq = -;
if(i < ) player[k].sc36 = -;
break; // skip other rounds (filled with -1, initially)
} else {
player[k].sc72 += player[k].sc[i];
if(i < )
player[k].sc36 += player[k].sc[i];
}
}
} // round 1
sort(player, player+n, cmp1);
assert(player[n_cut-].sc36 >= );
for(int i = n_cut-; i < n; i++)
if(i == n- || player[i].sc36 != player[i+].sc36) { n = i+; break; } // round 2
sort(player, player+n, cmp2); // print result
print_result(); if(T) printf("\n");
} return ;
}

紫書_例5-10 UVa207的更多相关文章

  1. [例1.10]使用setw设置输出宽度的例子

    [例1.10]使用setw设置输出宽度的例子: #include <iostream> #include <iomanip> using namespace std; void ...

  2. python基础教程_学习笔记10:异常

    异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...

  3. html提交表单,php在后台获取表单内容的方法_例1

    html代码:   <html>   <head>   <meta http-equiv="Content-Type" content="t ...

  4. C Primer Plus_第6章_循环_编程练习

    1.题略 #include int main(void) { int i; char ch[26]; for (i = 97; i <= (97+25); i++) { ch[i-97] = i ...

  5. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  6. 深度解密Go语言之关于 interface 的10个问题

    目录 1. Go 语言与鸭子类型的关系 2. 值接收者和指针接收者的区别 方法 值接收者和指针接收者 两者分别在何时使用 3. iface 和 eface 的区别是什么 4. 接口的动态类型和动态值 ...

  7. python得到一个10位随机数的方法及拓展

    https://blog.csdn.net/qq_33324608/article/details/78866760 无意中看到一个写10位随机数的方法,很有想法,然后就从学了一下随机数,相关东西都记 ...

  8. 推荐10款免费的在线UI测试工具

    发布网站之前至关重要的一步是网站测试.网站测试要求我们全面地运行网站并通过所有基本测试,如响应式设计测试.安全测试.易用性测试.跨浏览器兼容性.网站速度测试等. 网站测试对SEO.搜索引擎排名.转换率 ...

  9. nyoj123_士兵杀敌(四)_树状数组_插线求点

    士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...

随机推荐

  1. linux下php-mysql拓展安装

    今天遇到一个奇怪的问题: 在服务器A上部署应用,在服务器B上部署数据库和缓存. 服务器A:apache2.2,php5.3 服务器B:mysql5.5,redis2.4 问题现象: 本地远程连接服务器 ...

  2. Servlet调用过程

    (1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址. (2)浏览器根据ip地址和端口号访问服务器,组织http请求信息 ...

  3. Delphi中DBChart的数据库应用

    一:属性相关:Series选项: (1)Format页(数据柱的风格) 在Color Each中打勾,就可使用多种颜色显示,color按钮用于设置颜色,Style用于设置图表的风格(Rectangle ...

  4. vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法

    ---恢复内容开始--- 最近在安装了vsftpd后 添加了虚拟账户后 新建用户 为新用户创立独立的工作目录 因为虚拟用户在工作目录需要上传文件 所以必须拥有此目录的W权限,但每当给此目录加上W权限后 ...

  5. LINUX命令批量替换文件中的字符串

    sed -i "s/abcd/1234/g" `grep abcd -rl /home/data` find /data/web  -type f -exec  sed -i 's ...

  6. 85. Maximal Rectangle

    85. Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle c ...

  7. ***CodeIgniter集成微信支付(转)

    微信支付Native扫码支付模式二之CodeIgniter集成篇  http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...

  8. AngularJs学习

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. C++ 系列:虚函数

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  10. Kafka基本原理

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...