hdu 2093 考试排名 一直wa 求高人指点江上游大神指点

这道题目昨天做到今天啦,总算ac了,这道题目其实不难,只是有点麻烦,先按做的数目排序,然后再按和从小到大排序,最后还要按字典序排序,最后还有格式的控制,其实处理括号的时可以用sscanf(字符串首地址(不用引号),"%d(%d)",&a,&b),它返回的是输入数据的个数,其实sscanf与scanf的区别就是前者是已经输入的字符串中读入,后者是从键盘输入,返回的都是输入的个数
下面是没有用sscanf的代码:
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
#include &math.h&
struct &edg
&& & & &char s[100];
&& & & &int sum,ac,
}e[10000];
int cmp(const void *a,const void *b)
&& & if(((struct edg *)a)-&flag!=((struct edg *)b)-&flag)
&& & return ((struct edg *)b)-&flag-((struct edg *)a)-&
&& & else&
&& & & & & & & &if(((struct edg *)a)-&sum!=((struct edg *)b)-&sum)
&& & & & & & & &return ((struct edg *)a)-&sum-((struct edg *)b)-&
&& & & & & & & &else
&& & & & & & & &return strcmp(((struct edg *)a)-&s,((struct edg *)b)-&s);
int main()
&& &int n,m,i=0;
&& &char t[100];
&& &scanf("%d%d",&n,&m);
&& &while(scanf("%s",e[i].s)!=EOF)
&& & & & & &int a,b;
&& & & & & &e[i].sum=e[i].ac=e[i].flag=0;
&& & & & & &for(int j=0;j&n;++j)
&& & & & & &{
&& & & & & & & & & &int max=0;
&& & & & & & & & & &a=0;b=0;
&& & & & & & & & & &scanf("%s",t);
&& & & & & & & & & &int c=strlen(t);
&& & & & & & & & & &if(t[0]=='-'||!(t[0]-'0')) &
&& & & & & & & & & &else&
&& & & & & & & & & &{
&& & & & & & & & & & & & e[i].flag++;
&& & & & & & & & & & & & if(t[c-1]==')')
&& & & & & & & & & & & & {
&& & & & & & & & & & & & & & & & int k=0;
&& & & & & & & & & & & & & & & & while(t[k]!='(')
&& & & & & & & & & & & & & & & & {
&& & & & & & & & & & & & & & & & & & & &a=a*10+(t[k]-'0');
&& & & & & & & & & & & & & & & & & & & &k++;
&& & & & & & & & & & & & & & & & }
&& & & & & & & & & & & & & & & & &k++;
&& & & & & & & & & & & & & & & & &while(t[k]!=')')
&& & & & & & & & & & & & & & & & &{
&& & & & & & & & & & & & & & & & & & & & b=b*10+(t[k]-'0');
&& & & & & & & & & & & & & & & & & & & & k++;
&& & & & & & & & & & & & & & & & &}
&& & & & & & & & & & & & & & & & &e[i].sum+=a;
&& & & & & & & & & & & & & & & & &e[i].ac+=b;&
&& & & & & & & & & & & & }
&& & & & & & & & & & & & else
&& & & & & & & & & & & & e[i].sum+=atoi(t); &&
&& & & & & & & & & &}
&& & & & & &}
&& & & & & &e[i].sum+=e[i].ac*m; i++;&
&& &qsort(e,i,sizeof(e[0]),cmp);
&& &for(int &j=0;j&i;++j)
&& &printf("%-10s %2d %4d\n",e[j].s,e[j].flag,e[j].sum);
&& // system("pause");
&& &return 0;
阅读(...) 评论()下次自動登錄
現在的位置:
& 綜合 & 正文
HDOJ HDU 2093 考試排名 ACM 2093 IN HDU
++編程考試使用的實時提交系統,具有即時獲得成績排名的特點。它的功能是怎麼實現的呢?我們做好了題目的解答,提交之後,要麼「AC」,要麼錯誤,不管怎樣錯法,總是給你記上一筆,表明你曾經有過一次錯誤提交,因而當你一旦提交該題「AC」後,就要與你算一算帳了,總共該題錯誤提交了幾回。雖然你在題數上,大步地躍上了一個台階,但是在耗時上要攤上你共花去的時間。特別是,曾經有過的錯誤提交,每次都要攤上一定的單位時間分。這樣一來,你在做出的題數上,可能領先別人很多,但是,在做出同樣題數的人群中,你可能會在耗時上處於排名的劣勢。例如:某次考試一共8題(A,B,C,D,E,F,G,H),每個人做的題都在對應的題號下有個數量標記,負數表示該學生在該題上有過的錯誤提交次數,但到現在還沒有AC,正數表示AC所耗的時間,如果正數a跟上一對括弧,裡面有個整數b,那就表示該學生提交該題AC了,耗去了時間a,同時,曾經錯誤提交了b次,因此對於下述輸入數據:
若每次錯誤提交的罰分為20分,則其排名從高到低應該是這樣的:Josephus 5 376John 4 284Alice 4 352Smith 3 167Bob 2 325Bush 0 0
Input輸入數據的第一行是考試題數n(1≤n≤12)以及單位罰分數m(10≤m≤20),每行數據描述一個學生的用戶名(不多於10個字元的字串)以及對所有n道題的答題現狀,其描述採用問題描述中的數量標記的格式,見上面的表格,提交次數總是小於100,AC所耗時間總是小於1000。
Output將這些學生的考試現狀,輸出一個實時排名。實時排名顯然先按AC題數的多少排,多的在前,再按時間分的多少排,少的在前,如果湊巧前兩者都相等,則按名字的字典序排,小的在前。每個學生佔一行,輸出名字(10個字元寬),做出的題數(2個字元寬,右對齊)和時間分(4個字元寬,右對齊)。名字、題數和時間分相互之間有一個空格。
Sample Input8 20Smith
Sample OutputJosephus
題目分析 :
純粹考驗編程能力的題,
就交給自己隊里的牛人解決吧 ,
主要是使用 sscanf ()
用於判斷 有沒有括弧.
#include &cstdio&#include &cstdlib&#include &cstring&#define
typedef struct{
int cmp(const void *a, const void *b){
if ((*(credit *)a).total != (*(credit *)b).total)
return (*(credit *)a).total - (*(credit *)b).
else if ((*(credit *)b).sum != (*(credit *)a).sum)
return (*(credit *)b).sum - (*(credit *)a).
return strcmp((*(credit *)b).name, (*(credit *)a).name);}
int main(){
style[10];
c[MAX] = {0};
scanf ( "%d%d", &n, &m );
for ( i = 0; scanf("%s", c[i].name) != EOF; i++ )
for ( j = 0; j & j++ )
scanf ( "%s", style );
res = sscanf(style, "%d(%d)", &t, &f );
if ( res == 2 )
c[i].total++;
c[i].sum += t + f *
else if (res == 1 && t & 0)
c[i].total++;
c[i].sum +=
qsort(c, i, sizeof(credit), cmp);
for ( i--; i &= 0; i-- )
printf("%-10s %2d %4d\n", c[i].name, c[i].total, c[i].sum);
return 0;}
&&&&推薦文章:
【上篇】【下篇】有点难度的模拟题(10)
Time Limit:
MS (Java/Others) & &Memory Limit:
K (Java/Others)
Total Submission(s): 11379 & &Accepted Submission(s): 4026
Problem Description
C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?
我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:
若每次错误提交的罚分为20分,则其排名从高到低应该是这样的:
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
输入数据的第一行是考试题数n(1≤n≤12)以及单位罚分数m(10≤m≤20),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。
将这些学生的考试现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。
Sample Input
Josephus &72(3) 126
0 47 21(2)
Sample Output
Josephus & &5 &376
John & & & &4 &284
Alice & & & 4 &352
Smith & & & 3 &167
Bob & & & & 2 &325
Bush & & & &0 & &0
& & & & & &这个题目做的时候,竟然没有输出,吓尿我了……;
& & &然后,我就试着输出题目所给的测试数据,然后是对的就提交了!AC……
#include&stdio.h&
#include&iostream&
#include&string.h&
#include&algorithm&
char name[15];
// 定义结构体!
int cmp(pp s1,pp s2)
if(s1.number!=s2.number)
return s1.number&s2.
return s1.time&s2.
}//做一个比较
int main()
int m,n,j,i,k,l,k1;
char s[10];
scanf(&%d%d&,&m,&n);
while(~scanf(&%s&,a[l].name))
a[l].number=a[l].time=0;
for(i=0;i&m;i++)
scanf(&%s&,s);
if(s[0]=='-'||s[0]=='0')
int l1=strlen(s);
for(j=0;j&l1;j++)
if(s[j]=='(')
while(s[j]!=')')
k1=k1*10+(s[j]-'0');
k=k*10+(s[j]-'0');
a[l].number++;
a[l].time+=k+k1*n;
sort(a,a+l,cmp);
for(i=0;i&l;i++)
printf(&%-10s %2d %4d\n&,a[i].name,a[i].number,a[i].time);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23544次
排名:千里之外
原创:62篇
转载:30篇
(1)(3)(1)(7)(5)(22)(2)(4)(2)(6)(9)(1)(11)(8)(4)(3)(4)(1)}

我要回帖

更多关于 高人指点 贵人相助 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信