A1016の電話代(25分)
タイトル内容
長距離電話会社は、次の規則により、顧客を充電:
長距離電話をかけるコールが行われた日の時間に応じて、分あたり一定額の費用がかかります。顧客が長距離電話を接続し起動すると、時間が記録され、その顧客が電話をハングアップする時間になります。すべての暦月は、法案は(一日の時間によって決定される速度で)と呼ばれる各分間顧客に送信されます。あなたの仕事は、携帯電話の通話記録のセットが指定されると、各月の請求書を準備することです。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。料金体系、および携帯電話の通話記録:各ケースは2つの部分があります。
その日の各時間ように2:00、および- 1:00、1:00から有料-レート構造00:00から有料(セント/分)を示す24非負整数の行で構成され。
次の行はレコードのN行に続く正の数N(≤1000)を含みます。(:DD:HH:MM mm)で、ワードオンラインまたはオフラインの各携帯電話の通話記録は、顧客(スペースなしの最大20文字の文字列)、時刻と日付の名前で構成されています。
各テストケースの場合は、すべての日付は、単一ヶ月以内となります。同じ顧客は、それがオフラインレコードで提供するために、各オンライン・レコードは、時系列的に次のレコードとペアになっています。オンライン・レコードとペアになっていないオフラインのレコードがあるとオフラインレコードとペアにされていない任意のオンラインレコードは、無視されます。少なくとも一つの呼び出しがうまく入力にペアリングされていることを保証されています。あなたは、同じ顧客のための2つのレコードが同じ時間を持っていないと仮定してよいです。タイムズは、24時間クロックを使用して記録されています。
出力仕様:
各テストケースでは、各顧客の携帯電話の請求書を印刷する必要があります。
手形は、顧客名のアルファベット順に印刷されなければなりません。各顧客のために、最初の行に顧客の名前やサンプルが示す形式での法案の月を印刷します。(:HH:MM DD)、(分単位)持続時間と通話料次に呼び出しの各期間のために、1行で開始と終了時刻と日付を印刷します。呼び出しは、年代順にリストされなければなりません。最後に、サンプルによって示された形式での月の総電荷を印刷します。
サンプル入力:
10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
10
CYLL 01:01:06:01オンライン
CYLL 01:28:16:05オフライン
CYJJ 01:午前1時07分00秒オフライン
CYLL 01:01:08:03オフライン
CYJJ 01:01:05:59オンライン
AAA 01:01:01:03オンライン
AAA 01:02:00:01に-line
CYLL 01:28:15:41オンライン
AAA 01:05:02:24オンライン
AAA 01:04:23:59オフライン
サンプル出力:
CYJJ 01
一時05分59秒午前1時07分00秒61 $ 12.10
総額:$ 12.10
CYLL 01
1時06分01秒1時08分03秒122 $ 24.40
28:15:41 28:16:05 24 $ 3.85
総額:$ 28.25
AAA 01
2時○○分01秒4時23分59秒4318 $ 638.80
合計金額:$ 638.80
単語
札
英語/bɪls/ US /bɪls/
n個の紙幣;.運動(紙幣複合体)
N(ビルズ)名;.(英語、ドイツ語)ビール
V。課金(請求書三人称単数)
カレンダー
英語/ 'kælɪndə/ US /' kæləndɚ/
。Nカレンダー; [日]カレンダー、スケジュール
...テーブルに含まれるVT;スケジュールに...
表します
表示(現在分詞を表します)
通行料金
英語/təʊl/ US / Tolの/
VTコレクション;鐘
N通行料;考慮;鐘;死傷
。Viはベルを鳴らし、課税を
セント
英語/送ら/ US /sɛnt/
。N点、ペニー、ヴィンセント(半音100分の1に等しいです)
。N(セント)名(メソッド)が歌っ
時系列
英語/krɔnə'lɔdʒikli/ US /krɔnə'lɔdʒikli/
ADV。時系列グラウンド
ペアリング
英語/peəd/ US /peəd/
ADJペアを[カウント] ;.ペア
。Vは、ペアを作る。金具(一対の過去分詞)
アルファベット順の
英語/ælfə'betɪk(ə)L / US /、ælfə'bɛtɪkl/
ADJ文字;.アルファベット順に[カウント]
トピック分析
計算本質的シーケンシングおよび計算コストで経費請求書は、qsortは並べ替えに使用することができ、私は特別にブラッシュアップ昨日、ブログを書いた[C / C ++]のqsort関数の方法や詳細を使用。
ソート(比較のために、私は時間を分単位に変換すべての時間を置く)時間に応じて最初の名前順で並べ替え、その後、シーケンス、2はそれぞれの名前であるかどうかに応じて、存在する場合、ユーザーを決定するための良いシーケンスの後の行は、有効なレコードを持っていません出力は分の数を計算することである場合は、別のレコードと近隣諸国は、開始時刻と終了時刻は、紙幣の額を計算します。
紙幣の額の計算には、非常にシンプルに見えますが、状況はまだ解体がたくさんあり、私はそれを行うために始めた、日、時間以内に何が起こるかを分割するときに時間の複数が、空を横切っ時間の不満の数ある日、数日間の状況は、これらのケースでは、トラブルの多くを得ることができないに関わらず、確かに、極端なデータに対応しています。その後、私は分トラバースによって分法ほとんどの仏部門を、使用.....最後に、私は結論に来て、問題は、単にポイントをスクラップしていない解決することができます。
特定のコード
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ONLINE 0
#define OFFLINE 1
int fare[24];
struct record
{
char user[21];
int min;
int line_char;
};
int N, M;
struct record r[1001];
int convert_min(int d, int h, int m)
{
return d * 24 * 60 + h * 60 + m;
}
int compare_user(const void *p,const void *q)
{
return strcmp(((struct record*)p)->user, ((struct record*)q)->user);
}
int compare_min(const void *p, const void *q)
{
return ((struct record*)p)->min - ((struct record*)q)->min;
}
int main(void)
{
for (int i = 0; i < 24; i++)
scanf("%d", &fare[i]);
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
int d, h, m;
char line[10];
scanf("%s %d:%d:%d:%d %s", r[i].user, &M, &d, &h, &m, line);
r[i].min = convert_min(d, h, m);
if (strcmp(line, "on-line") == 0)
r[i].line_char = ONLINE;
else
r[i].line_char = OFFLINE;
}
qsort(r, N, sizeof(struct record), compare_user);
int begin = 0;
char* temp = r[begin].user;
int dayfare = 0;
for (int i = 0; i < 24; i++)
dayfare += fare[i];
for (int i = 0; i <= N; )
{
if (strcmp(temp, r[i].user) != 0)
{
qsort(r + begin, i - begin, sizeof(struct record), compare_min);
int flag = 0;
for (int n = begin; n < i; )
{
if (r[n].line_char == ONLINE && r[n + 1].line_char == OFFLINE && n + 1 < i)
{
flag = 1;
n += 2;
}
else n++;
}
if (flag)
{
printf("%s %02d\n", r[begin].user, M);
int sum = 0;
for (int n = begin; n < i; )
{
if (r[n].line_char == ONLINE && r[n + 1].line_char == OFFLINE && n + 1 < i)
{
printf("%02d:%02d:%02d", r[n].min / (24 * 60), r[n].min % (24 * 60) / 60, r[n].min % (24 * 60) % 60);
printf(" %02d:%02d:%02d", r[n + 1].min / (24 * 60), r[n + 1].min % (24 * 60) / 60, r[n + 1].min % (24 * 60) % 60);
printf(" %d", r[n + 1].min - r[n].min);
int mon = 0;
int start = r[n].min; int end = r[n + 1].min;
while (start != end )
{
mon += fare[(start % (60 * 24) / 60)];
start++;
}
sum += mon;
printf(" $%0.2f\n", mon / 100.0);
n += 2;
}
else n++;
}
printf("Total amount: $%0.2f\n", sum / 100.0);
}
begin = i;
temp = r[begin].user;
}
else i++;
}
system("pause");
}