細節較多,自己寫的第一份半殘品,未能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. VC++ : error LNK2005: ... already defined in *.obj

    今天写代码遇到了这么一个链接错误:"已经在*.obj中定义". error LNK2005: "void __cdecl ReplaceWstringVar(class ...

  2. 【原创】node+express+socket搭建一个实时推送应用

    技术背景 Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新. 应用场景: 监控系统:后台硬件热插拔.LED.温度.电压发生变化 即 ...

  3. oracleDBA-D2

    1.超级管理员sys和system的区别: sys权限比system大,system无法查看到当前数据库是否运行在归档模式下,无法关闭数据库.sys是老大,system是老二. 2.OEM-oracl ...

  4. [转]Unicode utf8等编码类型的原理

    FROM:http://www.cnblogs.com/daxiong2014/p/4768681.html 1.ASCII码          我们知道,在计算机内部,所有的信息最终都表示为一个二进 ...

  5. 书柜的尺寸(bzoj 1933)

    Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...

  6. 【笔记】MySQL查询排名

    select a.name, a.total_score,@rank:=@rank+1 as rank from (                  select u.name,uti.total_ ...

  7. C# 委托&事件

    之前关于事件这块理解一直不是很好,正好有空复习,整理记录一下 委托:可以将与自身形式相同(返回参数相同:传入参数相同)的方法当成参数进行传递. using UnityEngine; using Sys ...

  8. 动画系统(Mecanim补充)

      设置状态机部分等在实践中总结. 状态机基础: 动画层 Animation Layers Unity 使用"动画层"来管理身体不同部分的复杂状态机. 动画状态机  Animati ...

  9. 通过dll或def文件提取lib导入库文件

    很多时候第三方库或其他项目提供的库多数会以动态库的形式提供dll以及相应的lib导入库.头文件,不过也有的只是提供dll和头文件,或者也提供了def模块定义(用于导出函数)文件,此时若使用将不得不调用 ...

  10. CPU状态信息us,sy,ni,id,wa,hi,si,st含义

    转自:http://blog.csdn.net/sasoritattoo/article/details/9318893 转自:http://fishermen.iteye.com/blog/1995 ...