2011-08-21 19:27:37Morris
d232. 97北縣賽-3-資料統計問題
d232. 97北縣賽-3-資料統計問題
內容 :
3.資料統計問題問題敘述
有一間圖書公司希望針對客戶購書資料作統計以了解客戶喜好與市場分布。每一筆客戶購書資料有五個項目,包含有客戶姓名、性別、購買圖書類別、年齡、及單筆消費金額。圖書公司希望能從客戶購書歷史資料中,找出
(1) 哪一種圖書類別的總消費金額最高(假設不會有多個類別之總金額相等),
(2) 以年齡層為橫軸,總消費金額等級為縱軸的客戶數分布,以及
(3) 總消費金額最高的五位客戶姓名與其總消費金額(與第五名客戶之總消費金額相同之客戶名稱要全部列出,若全部客戶數不足五位,則列出所有客戶之姓名與其總消費金額)。
//抱歉測資有誤已從測
輸入說明
:
條件限制
<1>客戶姓名為英文,長度不超過20個字元。
<2>性別以M或F表示男性或女性。
<3>購買圖書類別共五類,代碼為A, B, C, D, E。
<4>客戶年齡皆介於1~100歲。年齡層以1~10, 11~20, 21~30, …, 91~100共分為十個年齡層。<5>每位客戶的總消費金額不超過10,000元。總消費金額等級以 1~1000, 1001~2000, …, 9001~10000 分為十個等級。
<6>資料檔總筆數不超過100筆。每位客戶可能有多於一筆交易記錄,並假設不存在兩個人有相同姓名的情況。
輸入格式
第一行為一個正整數值,表示客戶購書資料筆數。
接下來各行分別輸入一筆客戶購書資料的五個項目值,每個項目值間以空白字元隔開。
輸出說明
:
輸出格式
<1> 總消費金額最高的圖書類別,[換行]
<2> 年齡層與總消費金額等級的客戶數分布表(表格第一列為總消費金額等級1~1000元,第一欄為年齡層1~10歲),[換行]
<3> 總消費金額最高的五位客戶姓名與總消費金額(如問題描述第(3)點說明),每位資料請以[換行]隔開,由總消費金額高到低排列,若相同以字典由小排到大排序。
範例輸入 :
3 Alice F A 25 250 Hebe F B 25 1000 Alice F A 25 250
範例輸出 :
B 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Hebe 1000 Alice 500
提示
:
出處
:
/**********************************************************************************/
/* Problem: d232 "97北縣賽-3-資料統計問題" from 北縣縣賽 */
/* Language: C */
/* Result: AC (0ms, 238KB) on ZeroJudge */
/* Author: morris1028 at 2011-08-21 18:42:23 */
/**********************************************************************************/
#include<stdio.h>
#include<string.h>
void Merge(int, int, int);
void MergeSort(int, int);
char name[101][21], s[20], FM[2], book[2];
int custyr[101] = {}, custmy[101] = {};
int Data[101], X[101];
main() {
int n;
while(scanf("%d", &n) == 1) {
int map[10][10] = {}, tpbook[27] = {};
int yr, my, a, b, c, namet = 0, Idx;
memset(custmy, 0, sizeof(custmy));
for(a = 0; a < n; a++) {
scanf("%s %s %s %d %d", s, FM, book, &yr, &my);
for(b = 0; b < namet; b++)
if(!strcmp(name[b], s))
break;
if(b == namet) namet++, strcpy(name[b], s);
Idx = b;
custyr[Idx] = yr, custmy[Idx] += my;
tpbook[book[0]-'A'] += my;
}
int max = 0, maxv, x, y;
for(a = 0; a < 26; a++)
if(tpbook[a] > max)
max = tpbook[a], maxv = a;
printf("%c\n", maxv+'A');
for(a = 0; a < namet; a++) {
x = (custyr[a]-1)/10, y = (custmy[a]-1)/1000;
map[y][x] ++;
}
for(a = 0; a < 10; a++) {
for(b = 0; b < 10; b++)
printf("%d ", map[a][b]);
puts("");
}
for(a = 0; a < namet; a++) Data[a] = a;
MergeSort(0, namet-1);
int i = namet > 5 ? 4 : namet-1, j = custmy[Data[i]];
for(a = 0; a < namet; a++)
if(custmy[Data[a]] >= j)
printf("%s %d\n", name[Data[a]], custmy[Data[a]]);
}
return 0;
}
int cmp(int x, int y) {
if(custmy[x] > custmy[y])
return 1;
else if(custmy[x] < custmy[y])
return 0;
else {
int a;
for(a = 0; ; a++)
if(name[x][a] < name[y][a])
return 1;
else if(name[x][a] > name[y][a])
return 0;
return 1;
}
}
void Merge(int l, int m, int h) {
int In1 = l, In2 = m+1;
int a, b, Top = 0;
while(In1 <= m && In2 <= h)
if(cmp(Data[In1], Data[In2]))
X[Top++] = Data[In1++];
else X[Top++] = Data[In2++];
while(In1 <= m) X[Top++] = Data[In1++];
while(In2 <= h) X[Top++] = Data[In2++];
for(a = 0, b = l; a < Top; a++, b++)
Data[b] = X[a];
}
void MergeSort(int l, int h) {
if(l < h) {
int m = (l+h)/2;
MergeSort(l, m);
MergeSort(m+1, h);
Merge(l, m, h);
}
}