知识补充:

①:ssprintf:

   int sprintf(char *str, const char *format, ...)
   发送格式化输出到 str 所指向的字符串。
   char str[80];

   sprintf(str, "Pi 的值 = %f", M_PI);
   puts(str);

②:strchr

   如果需要对字符串中的单个字符进行查找,
        那么应该使用 strchr 或 strrchr 函数。
        其中,strchr 函数原型的一般格式如下:
        char *strchr(const char *s, int c);
        它表示在字符串 s 中查找字符 c,
        返回字符 c 第一次在字符串 s 中出现的位置,
        如果未找到字符 c,则返回 NULL。也就是说,
        strchr 函数在字符串 s 中从前到后(或者称为从左到右)查找字符 c,
        找到字符 c 第一次出现的位置就返回,
        返回值指向这个位置,如果找不到字符 c 就返回 NULL。
        相对于 strchr 函数,strrchr 函数原型的一般格式如下:
        char *strrchr(const char *s, int c);
        与 strchr 函数一样,它同样表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。但两者唯一不  同的     是,strrchr 函数在字符串 s 中是从后到前(或者称为从右向左)查找字符 c,找到字符 c 第一次出现的位置就返回,返回值指向这个位   置。

③:sscanf

  Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); 
  int scanf( const char *format [,argument]... );

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。 简单地说就是输入的类型不同。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cassert>
using namespace std; const int n_cut = ;
const int maxn = ; struct Player
{
char name[];
int amateur;//业余
int sc[];//4轮分数
int sc36, sc72, dq;//前两局分数,和前4局分数,是否犯规
int rnds;
}players[maxn]; double purse,p[];//总金额和百分比
int n;//选手人数 bool cmp1(const Player& p1,const Player &p2)
{
if(p1.sc36<&&p2.sc36<)//equal
return false;
if(p1.sc36<)//p1 DQ,p2 不DQ,把DQ的p1放后面
return false;
if(p2.sc36<)//p1 !DQ,p2 DQ
return true;
return p1.sc36<p2.sc36;
} bool cmp2(const Player& p1,const Player & p2)
{
if(p1.dq&&p2.dq)//p1,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)//p1 DQ,p1排后面
return false;
if(p2.dq)//p2 DQ,p2排后面
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=;//pos所占百分比的下标 while(i<n)
{
if(players[i].dq)//DQ
{
printf("%s ",players[i].name);
for(int j=;j<players[i].rnds;j++)
{
printf("%-5d",players[i].sc[j]);
}
for(int j=;j<-players[i].rnds;j++)
{
printf(" ");
}
printf("DQ\n");
i++;
continue;
} int j=i;
int m=;//并列的人数
bool have_money=false;
double tot=0.0;
while(j<n&&players[i].sc72==players[j].sc72)
{
if(!players[j].amateur)//成绩一样且不业余
{
m++;
if(pos<n_cut)
{
have_money=true;
tot+=p[pos++];
}
}
j++;
} // print player [i,j) together because they have the same rank
int rank=i+;//并列选手的名次
double amout=purse*tot/m;
// if m=0, amount will be nan but we don't use it in that case :)
while(i<j)
{
printf("%s ", players[i].name);
char t[];
sprintf(t,"%d%c",rank,m>&&have_money&&!players[i].amateur?'T':' ');
printf("%-10s",t);
for(int k=;k<;k++)
{
printf("%-5d",players[i].sc[k]);
} //打印总分和奖金
if(!players[i].amateur&&have_money)
{
printf("%-10d",players[i].sc72);
printf("$%9.2lf\n",amout/100.0);
}
else
{
printf("%d\n",players[i].sc72);
}
i++;
}
}
} int main()
{
int T;//测试数目
char s[];
gets(s);
sscanf(s, "%d", &T);
while (T--)
{
gets(s);//取空行
gets(s);
sscanf(s,"%lf",&purse);
for(int i=;i<n_cut;i++)
{
gets(s);
sscanf(s,"%lf",&p[i]);
}
//scanf("%d",&n);
gets(s);
sscanf(s,"%d",&n);//
assert(n <= );//
for(int i=;i<n;i++)
{ gets(s);
strncpy(players[i].name,s,);
players[i].name[]=;
players[i].amateur=;
if(strchr(players[i].name,'*'))//给name赋值
players[i].amateur=-;
//scores
players[i].sc36=players[i].sc72=players[i].dq=;
memset(players[i].sc,-,sizeof(players[i].sc));
//下面取分数
for(int j=;j<;j++)
{
char t[];
for(int k=;k<;k++)
{
t[k]=s[+j*+k];//挨个取,取前三个成绩
}
t[]='\0';
//下面检查是否DQ,利用第四个成绩
if(!sscanf(t,"%d",&players[i].sc[j]))//两种可能:1.第四个是DQ,2.前面有DQ,此处没有数字
{
players[i].rnds=j;
players[i].dq=-;
if(j<)
players[i].sc36=-;
break;
}
else
{
players[i].sc72+=players[i].sc[j];
if(j<)
players[i].sc36+=players[i].sc[j];
}
}
}
//第一次排序
sort(players,players+n,cmp1);//从小到大,前70名晋级
assert(players[n_cut-].sc36 >= );
for(int i=n_cut-;i<n;i++)//看看第70名有没有并列的,修改n
{
if(i==n-||players[i].sc36!=players[i+].sc36)
{
n=i+;//sort左闭右开,所以+1
break;
}
} //第二次排序
sort(players,players+n,cmp2); //print_result
print_result(); if(T)
printf("\n");
}
return ;
}

UVA 207 PGA Tour Prize Money的更多相关文章

  1. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  2. 紫书第5章 C++STL

    例题 例题5-1 大理石在哪儿(Where is the Marble?,Uva 10474) 主要是熟悉一下sort和lower_bound的用法 关于lower_bound: http://blo ...

  3. 紫書_例5-10 UVa207

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

  4. SFC游戏列表(维基百科)

    SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...

  5. ACM - 动态规划 - UVA 1347 Tour

    UVA 1347 Tour 题解 题目大意:有 \(n\) 个点,给出点的 \(x\).\(y\) 坐标.找出一条经过所有点一次的回路,从最左边的点出发,严格向右走,到达最右点再严格向左,回到最左点. ...

  6. UVa 1347 Tour

    Tour Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description   Joh ...

  7. UVA 1347 Tour 【双调旅行商/DP】

    John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...

  8. Tour UVA - 1347

    John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...

  9. UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)

    Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...

随机推荐

  1. 初见TensorFlow :知其所以然

    2.1 TensorFlow的主要依赖包 TensorFlow依赖的两个最主要的工具包——Protocol Buffer和Bazel. 2.1.1 Protocol Buffer Protocol B ...

  2. laravel CSRF 保护

    在开始之前让我们来实现上述表单访问伪造的完整示例,为简单起见,我们在路由闭包中实现所有业务代码: Route::get('task/{id}/delete', function ($id) { ret ...

  3. CF 1042F

    玄学贪心... 题意:给出一棵树,要求将他的所有叶节点分成最少的组,且在每组中的任意两节点之间的距离不大于k 解析: 显然是个贪心啦... 稍微考虑一下贪心思想: 我们从下向上合并整棵树,在合并到某个 ...

  4. Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档

    写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档 import java.io.File; import java.io.FileNotFoundException; import ...

  5. 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)

    论文源址:https://arxiv.org/abs/1612.03144 代码:https://github.com/jwyang/fpn.pytorch 摘要 特征金字塔是用于不同尺寸目标检测中的 ...

  6. 论文阅读笔记七:Structure Inference Network:Object Detection Using Scene-Level Context and Instance-Level Relationships(CVPR2018)

    结构推理网络:基于场景级与实例级目标检测 原文链接:https://arxiv.org/abs/1807.00119 代码链接:https://github.com/choasup/SIN Yong ...

  7. 读C#开发实战1200例子记录-2017年8月14日10:03:55

    C# 语言基础应用,注释 "///"标记不仅仅可以为代码段添加说明,它还有一项更重要的工作,就是用于生成自动文档.自动文档一般用于描述项目,是项目更加清晰直观.在VisualStu ...

  8. ubuntu下使用matplotlib绘图无法显示中文label

    原因是字体导致的.大家的做法基本都是搞一个windows上的字体文件(simhei.ttf, 点我fq下载)然后刷新一下缓存文件. 只不过百度搜到第一篇CSDN的博客,写的很不靠谱(不是所有的CSDN ...

  9. PAT Basic 1069. 微博转发抽奖(20)

    小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包.请你编写程序帮助他确定中奖名单. 输入格式: 输入第一行给出三个正整数M(<= 1000).N ...

  10. PHP SOAP 发送XML

    <?php $xmldata = <<<EOT <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap. ...