您的位置:首页 > 其它

【Week2实验 B】爆零(×)大力出奇迹(√) 【暴力】

2020-03-08 16:34 465 查看

题意:

一次考试共n道题(1<=n<=12),单位罚时为m(10<=m<=20)(即交错题目惩罚的时间)。给定每个同学(同学数目不固定,根据EOF判断)每道题的标记,正数表示AC所耗时间,括号内表示错误提交次数,非正数表示没有A掉该题。输入形式如 xingming 96 -3 40(3) 0。要求根据同学的得分现状,输出一个实时排名。排名首先按AC题数排,多的在前,再按时间分的多少排,少的在前,最后按名字的字典序排,小的在前。每个同学占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐),名字、题数和时间分相互之间有一个空格。

思路:

用结构people来存储同学姓名name、分数string score[13]、答对题数ans和时间分time。bool cmp函数根据所给排序方法进行比较。在main函数中,每当读取一位同学的一个分数,若分数大于0,则答对题,ans++,然后处理时间。若分数中没有’(’,则直接将string转换为int加入到time里;若有’(’,则进行处理,将’(‘之前的时间加入到time里,然后将"()"内的错误次数乘上罚时再加入到time里。
将string转换为int使用到了atoi函数和string类的c_str()函数。后面读取’(‘之前的时间是将每一位string取出,减去’0’,加上原时间*10得到的。
最后输出格式需要用到std::left左对齐,std::right右对齐和setw(10)输出10个字符宽。

总结:

一道暴力模拟题,根据题意写出适当的结构体,然后一步步模拟即可。

代码:

#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>
#include <algorithm>
using namespace std;

int n,m;
struct people
{
string name;
string *score=new string[13];
int ans;
int time;
}p[10000];

bool cmp(const people&p1,const people&p2)
{
if(p1.ans>p2.ans)	return true;
else if(p1.ans<p2.ans)	return false;
else
{
if(p1.time<p2.time)	return true;
else if(p1.time>p2.time)	return false;
else
{
if(p1.name<=p2.name)	return true;
else	return false;
}
}
}

int main()
{
cin>>n>>m;
int sum=0;	//总人数
while(cin>>p[sum].name)
{
for(int i=0;i<n;i++)
{
cin>>p[sum].score[i];
if(p[sum].score[i]>"0")	//答对题
{
p[sum].ans++;
//处理时间
if(p[sum].score[i].find("(")==string::npos)	//无()
p[sum].time+=atoi(p[sum].score[i].c_str());
else	//有()
{
int thistime=0;	//()之前的时间
int index=0;
for(;index<p[sum].score[i].size();index++)
{
if(p[sum].score[i].at(index)=='(')	break;
else thistime=thistime*10+p[sum].score[i].at(index)-'0';
}
p[sum].time+=thistime;
thistime=0;	//()内的交错次数
for(;index<p[sum].score[i].size();index++)
{
if(p[sum].score[i].at(index)=='(')	continue;
else if(p[sum].score[i].at(index)==')')	break;
else thistime=thistime*10+p[sum].score[i].at(index)-'0';
}
p[sum].time+=thistime*m;
}
}
}
sum++;
}
sort(p,p+sum,cmp);
for(int i=0;i<sum;i++)
{
cout<<std::left<<setw(10)<<p[i].name<<" "<<std::right<<setw(2)<<p[i].ans<<" "<<std::right<<setw(4)<<p[i].time<<endl;
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
xKuro 发布了8 篇原创文章 · 获赞 0 · 访问量 170 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: