ACM大会ランキング問題のコンテストランキング
4133 ワード
タイトルの説明
HBMYの第6回コンピュータープログラム設計コンテスト(非専門グループ)が盛んに行われています.みんなは時々試合のランキングを見て、自分のチームがどの位置にあるかを見ています.今、Jarilyはこのランキングがどのように得られたのか教えてあげます.
まず試合のルールを言わなければならない.今回の試合は全部で10のテーマがあり、試合時間は5時間(0~300分)で、試合期間中、チームごとに1台のパソコンを使うには5時間以内にC、C++またはJavaのいずれかの作成プログラムを使ってこの10の問題を解決する必要がある.プログラムが完了したら審判機に提出して実行し、正しいか間違ったかの2つの結果を返します.
最後の優勝者は、正解が最も多く、総使用時間が最も少ないチームである.
各試験問題の時間は、コンテスト開始から試験問題の提出が正しいと判定されるまでの時間がかかり、その間に1回の提出ごとに運転結果が誤って判定されると20分加算され、正しく解答されていない試験問題が記入されていない場合は、正しい問題に戻ってから繰り返し提出すれば結果に影響しません.
例えば、A、B両チームは2つの問題を正しく完成し、そのうちAチームがこの2つの問題を提出した時間は試合開始後60分と165分で、Bチームは80分と130分だったが、Bチームの最初の問題は2回提出してやっと合格した.このようにAチームの総使用時間は60+165=225で、Bチームは(80+20)+130=230なので、Aチームは総使用時間が少なくて勝った.
審判機の上のすべてのチームの提出時間(分数)と結果を返すには、現在の試合のランキングをプログラミングして出力する必要があります.
入力
1行目は2つの正の整数NとMと入力され、NはNチームが参加していることを示し、Mは審判機の上にM回提出されていることを示している.
次に、M行が入力され、各行がスペースで区切られた文字列S 1、2つの整数A、B、および1つの文字列S 2が入力されます.ここで、S 1は参加チーム番号(team 1からteamN)、Aは提出時間(0から300)、Bは提出されたテーマ番号(1から10)、S 2は返信結果を表し、S 2はYesまたはNoのみとなります.
秒の影響を無視すると、同じチームが同じ分以内に同じ問題を提出することはありません.
しゅつりょく
出力はN行あり、簡易ランキングを出力します.すなわち、試合ルールに従って、このNチームを1位からN位まで逐行出力し、各行に詳細情報を出力する.
各行の出力内容と順序は、チーム番号(team 1~teamN)、ランキング(1~N)、解題数(0~10)、通過した問題の合計時間、そして10個の整数を出力し、10個の問題の通過状況を表し、この問題が通過しなければ-1、通過すればその経過時間を出力し、その問題の加罰時間を加える必要がある.各行の出力内容はスペースで区切られています.
2つのチームの解題数と解題時間が完全に同じ場合は、そのチーム番号に従って小さいから大きいまで並べます.
サンプル入力
サンプル出力
チーム4は「チーム」と数字4を2つのstringで「チーム」+「4」を加算するには、YesとNoが実行され、stringタイプも推奨されません
HBMYの第6回コンピュータープログラム設計コンテスト(非専門グループ)が盛んに行われています.みんなは時々試合のランキングを見て、自分のチームがどの位置にあるかを見ています.今、Jarilyはこのランキングがどのように得られたのか教えてあげます.
まず試合のルールを言わなければならない.今回の試合は全部で10のテーマがあり、試合時間は5時間(0~300分)で、試合期間中、チームごとに1台のパソコンを使うには5時間以内にC、C++またはJavaのいずれかの作成プログラムを使ってこの10の問題を解決する必要がある.プログラムが完了したら審判機に提出して実行し、正しいか間違ったかの2つの結果を返します.
最後の優勝者は、正解が最も多く、総使用時間が最も少ないチームである.
各試験問題の時間は、コンテスト開始から試験問題の提出が正しいと判定されるまでの時間がかかり、その間に1回の提出ごとに運転結果が誤って判定されると20分加算され、正しく解答されていない試験問題が記入されていない場合は、正しい問題に戻ってから繰り返し提出すれば結果に影響しません.
例えば、A、B両チームは2つの問題を正しく完成し、そのうちAチームがこの2つの問題を提出した時間は試合開始後60分と165分で、Bチームは80分と130分だったが、Bチームの最初の問題は2回提出してやっと合格した.このようにAチームの総使用時間は60+165=225で、Bチームは(80+20)+130=230なので、Aチームは総使用時間が少なくて勝った.
審判機の上のすべてのチームの提出時間(分数)と結果を返すには、現在の試合のランキングをプログラミングして出力する必要があります.
入力
1行目は2つの正の整数NとMと入力され、NはNチームが参加していることを示し、Mは審判機の上にM回提出されていることを示している.
次に、M行が入力され、各行がスペースで区切られた文字列S 1、2つの整数A、B、および1つの文字列S 2が入力されます.ここで、S 1は参加チーム番号(team 1からteamN)、Aは提出時間(0から300)、Bは提出されたテーマ番号(1から10)、S 2は返信結果を表し、S 2はYesまたはNoのみとなります.
秒の影響を無視すると、同じチームが同じ分以内に同じ問題を提出することはありません.
しゅつりょく
出力はN行あり、簡易ランキングを出力します.すなわち、試合ルールに従って、このNチームを1位からN位まで逐行出力し、各行に詳細情報を出力する.
各行の出力内容と順序は、チーム番号(team 1~teamN)、ランキング(1~N)、解題数(0~10)、通過した問題の合計時間、そして10個の整数を出力し、10個の問題の通過状況を表し、この問題が通過しなければ-1、通過すればその経過時間を出力し、その問題の加罰時間を加える必要がある.各行の出力内容はスペースで区切られています.
2つのチームの解題数と解題時間が完全に同じ場合は、そのチーム番号に従って小さいから大きいまで並べます.
サンプル入力
6 10
team4 15 9 No
team4 16 9 No
team4 20 9 Yes
team4 26 4 Yes
team1 15 9 No
team3 15 10 No
team3 16 10 Yes
team1 30 3 Yes
team2 36 7 Yes
team6 35 2 No
サンプル出力
team4 1 2 86 -1 -1 -1 26 -1 -1 -1 -1 60 -1
team1 2 1 30 -1 -1 30 -1 -1 -1 -1 -1 -1 -1
team2 3 1 36 -1 -1 -1 -1 -1 -1 36 -1 -1 -1
team3 4 1 36 -1 -1 -1 -1 -1 -1 -1 -1 -1 36
team5 5 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
team6 6 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
:
scanf cin ,cin , , , scanf , cin !!!
チーム4は「チーム」と数字4を2つのstringで「チーム」+「4」を加算するには、YesとNoが実行され、stringタイプも推奨されません
AC :
#include "iostream"
#include "cstdlib"
#include "cstring"
#include "string"
#include "cstdio"
#include "algorithm"
#include "vector"
using namespace std;
struct Team
{
int sum; //
int time; //
int num; //AC
vector s; // 10 , , -1
vector count; // 10
}a[51];
bool cmp(Team a,Team b) //
{
if (a.num!=b.num)
{
return a.num>b.num;
}
else
{
if (a.time!=b.time)
{
return a.time>n>>m;
//getchar();
memset(a,0,sizeof(a));
for (i=1;i<20;i++)//
{
a[i].sum=i;
for (j=0;j<=20;j++)
{
a[i].s.push_back(-1);
a[i].count.push_back(0);
}
}
while(m--)
{
istime=0;
scanf(" team%d%d%d%s",&num,&istime,&id,&is);// , , getchar();
//getchar();
//cin>>team1>>istime>>id>>is;// ( team1 string , “teamN”,N=1,2,3,....n)
//i=team1[4]-'0';
i=num; //
if (is[0]=='Y')
{
if (a[i].s[id]==-1)// AC
{
a[i].s[id]=istime+a[i].count[id]*20;
a[i].time+=a[i].s[id];
a[i].num++;
}
}
else if(is[0]=='N')
{
if (a[i].s[id]==-1)// AC
{
a[i].count[id]++;
}
}
}
sort(a+1,a+n+1,cmp);
for (i=1;i<=n;i++)
{
cout<