細節較多,自己寫的第一份半殘品,未能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. python 使用pymssql连接sql server数据库

    python 使用pymssql连接sql server数据库   #coding=utf-8 #!/usr/bin/env python#------------------------------ ...

  2. iOS CocoaPods 版本安装问题

    今天安装salesforce中的pods,这是里面的podfile # Uncomment this line to define a global platform for your project ...

  3. 【python】发送post请求

    1. json格式的post请求 关键部分加粗显示了,主要是post数据的编码方式以及请求头的Content-type #coding=utf8 import json import gzip imp ...

  4. C# 动态调用DLL库

    最近经常用到C#动态调用类库,简单的做下记录方便以后查询. 使用下面的几行代码就可以简单实现DLL类库的调用了 using System.Reflection; // 引入该命名空间 // 获取roc ...

  5. 完全卸载AndroidStudio

    一:卸载Android Studio 由于从1.5正式版直接升级到2.1的版本,整个项目构建都变得异常的慢,所以决定卸载重新安装2.0的正式版.但是Mac下使用dmg安装的app很多都是不能使用拖拽的 ...

  6. NYOJ之题目325 zb的生日

    -------------------------------------- 刷一辈子水题... AC代码: import java.util.Scanner; public class Main { ...

  7. 【转载】制作一个超精简的WIN7.gho

    首先说明一点,这个Resource不是我制作的,Google搜了下GHO镜像文件制作,挺复杂的.如果要从头到尾自己制作GHO文件可以参考: http://baike.so.com/doc/674790 ...

  8. Flash: An Efficient and Portable Web Server

    Introduction This paper presents the design of a new Web server architecture called the asymmetric m ...

  9. 更改pip安装源的镜像解决安装总是timeout的情况

    由于国外的pip源总是由于各种原因不能被访问或者网速过慢,而造成的timeout错误 解决方法是修改pip的配置文件(如果没有配置文件在相应的地方新建,配置文件的路径和名字参考这里),设置安装包时候访 ...

  10. spin.js

    $ajax提交,菊花加载的方式和位置: $.ajax({ type: "get", url: "http://www.xxx.com/test.html", b ...