紫書_例5-10 UVa207
細節較多,自己寫的第一份半殘品,未能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.10]使用setw设置输出宽度的例子
[例1.10]使用setw设置输出宽度的例子: #include <iostream> #include <iomanip> using namespace std; void ...
- python基础教程_学习笔记10:异常
异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...
- html提交表单,php在后台获取表单内容的方法_例1
html代码: <html> <head> <meta http-equiv="Content-Type" content="t ...
- 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 ...
- BZOJ_5055_膜法师_树状数组+离散化
BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...
- 深度解密Go语言之关于 interface 的10个问题
目录 1. Go 语言与鸭子类型的关系 2. 值接收者和指针接收者的区别 方法 值接收者和指针接收者 两者分别在何时使用 3. iface 和 eface 的区别是什么 4. 接口的动态类型和动态值 ...
- python得到一个10位随机数的方法及拓展
https://blog.csdn.net/qq_33324608/article/details/78866760 无意中看到一个写10位随机数的方法,很有想法,然后就从学了一下随机数,相关东西都记 ...
- 推荐10款免费的在线UI测试工具
发布网站之前至关重要的一步是网站测试.网站测试要求我们全面地运行网站并通过所有基本测试,如响应式设计测试.安全测试.易用性测试.跨浏览器兼容性.网站速度测试等. 网站测试对SEO.搜索引擎排名.转换率 ...
- nyoj123_士兵杀敌(四)_树状数组_插线求点
士兵杀敌(四) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战 ...
随机推荐
- spring mvc 中文参数乱码
最近做项目,springmvc的url中文参数乱码: 请求url: http://localhost:8080/supply/supply_list.htm?productName=测试&is ...
- Unity3D 响应摇杆
if (Input.GetKeyUp(KeyCode.Joystick1Button0)) { Debug.Log("Joystick1Button0"); } if (Input ...
- vs2012 安装entity framework
1.安装vs2012 2.打开vs2012的工具下的扩展工具 3.搜索nuget,没安装的直接在线安装 4.安装好了NuGet,程序包管理器控制台 5.执行命令Install-Package Enti ...
- SQL添加维护 计划失败
在sql要求数据库每天自动备份这个是大家都会遇到的问题,我遇到了这个问题如图: 是因为这个服务组件没有安装
- 用代码控制鼠标键盘(C#语言)
前些时间想做一个鼠标点击器,用到了这些知识. 下面整理记录一下. ps.感谢各位大神 下面直接上代码 1.鼠标的控制 class MouseMove { #region MouseEvent [Sys ...
- 【转】Redis入门
Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用 ...
- PHP中的一些常用正则表达式
匹配表单验证 验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 验证账号,不能为空,不能有空格,只能是英文字母:^\S+[a-z ...
- python ImportError: No module named builtins
解决方案: sudo pip install future
- SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)
在一个网站启动.结束时,我们经常有些操作是需要执行的. 熟悉Asp.net的朋友,使用Global.asax很容易就搞定,在其中有Application_Start和Application_E ...
- 【DWR系列01】-DWR简介及入门例子
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...