2011-06-11 07:59:43Morris

d548. 5. 購物網站(web)

http://zerojudge.tw/ShowProblem?problemid=d548

內容 :

新奇公司一向以購物網站為行銷產品的主要管道,最近新奇公司的營收大幅減少,業務部門決定針對購物網站的行銷狀況做一檢討。專家認為由分析網站的瀏覽與購物狀況可了解客戶的購物行為,藉此可改善行銷策略,以增加營收。

首 先需要了解客戶的網站瀏覽時段,據此可加強重點時段的廣告,以增進效益。系統必須分別於每個客戶登入與登出時,記錄其時間,以便統計客戶瀏覽的高峰值與高 峰時段:瀏覽高峰值即為專家有興趣的統計時段中同時瀏覽購物網站之使用者的最大值;瀏覽高峰時段即為瀏覽高峰值發生之子時段,此種時段可能有兩段以上。其 次為掌握客戶的購物需求,增加受歡迎商品的樣式與供貨量,系統亦須回報最受歡迎商品,亦即統計時段中被購買最多次數的商品,此種商品可能會有兩個以上。

請寫一個程式協助專家分析客戶的瀏覽與購物狀態。

  1. 時間以分為單位,是 0(零時零分)到 1439(二十三時五十九分) 的整數。
  2. 統計時段之起點 S >= 0,終點 E <= 1439,且 S < E 統計時段內至少會有一個客戶登入。
  3. 專家只對統計時段中的事件有興趣。
  4. 客戶帳號為 1 到 100 的整數。
  5. 物品的標號為 A 到 Z 的英文字母。
  6. 客戶登入、登出、與購買時間皆以零時零分為起點計算。
  7. 每位客戶某一時間點的購買物品只能有一項,且個數為一。
  8. 某一客戶有可能於登入時段沒有任何購買商品。
  9. 某一客戶有可能於同一段登入時間內購買兩個以上的同一項商品。

 

輸入說明 :

輸入檔案第一行是紀錄總筆數 n,表示統計時段內,共有 n 筆登入登出紀錄(客戶可重複登入)

第二行為專家有興趣的統計時間之起點 S 與終點 E ,中間以空白隔開,例如:82 840 表示統計時間為 1 時 22 分到 14 時 0 分

接下來的 n 行每一行代表一筆客戶登入登出資料:

每行資料第一個數字是客戶帳號,第二個與第三個數字分別為登入與登出時間,第四個數字代表此次登入所採購之商品數量,第五個以後的資料會成對出現,分別代表購買時間與購買商品品項。

輸出說明 :

輸出檔案共有 3 行

第一行是一個數字,代表瀏覽高峰值

第 二行是瀏覽高峰時段,由開始時間與結束時間組成 (中間以空白隔開),若有兩段以上,則中間以空白分開,且以時段起點時間做排序,例如:224 312 730 891 表示 3 時 44 分到 5 時 12 分,以及 12 時 10 分到 14 時 51 分兩個時段,連續時段不可分開輸出,例如:33 55 不可分開為 33 40 與 41 55 兩時段

第三行是最受歡迎商品品項,若統計時段內所有客戶皆沒購買,則品項以 ? 表示,若最受歡迎商品有兩個以上,則以空白分開,且依字母順序由 A 到 Z 排列

範例輸入 :

輸入檔範例 1
6
88 840 
21 30 177 2 61 R 90 A 
38 600 825 0
15 563 1021 3 630 A 663 B 921 A
21 153 543 1 273 B
32 73 404 1 312 R
8 427 650 1 571 B

輸入檔範例 2
3
260 1330
21 612 1003 0
8 30 273 0
51 420 608 0

範例輸出 :

輸出檔範例 1
3 
153 177 600 650
B

輸出檔範例 2
1 
260 273 420 608 612 1003
?

提示 :

出處 :

北市 98 資訊學科能力競賽 (管理:example)


作法 : 模擬

/**********************************************************************************/
/*  Problem: d548 "5. 購物網站(web)" from 北市 98 資訊學科能力競賽*/
/*  Language: C                                                                   */
/*  Result: AC (0ms, 286KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-11 07:18:59                                     */
/**********************************************************************************/


#include<stdio.h>
main() {
    int t, s, e, a, b, x, in, out, n;
    while(scanf("%d", &t) == 1) {
        scanf("%d %d", &s, &e);
        int time[1441] = {}, p[26] = {};
        int buy;
        char item[3];
        for(a = 0; a < t; a++) {
            scanf("%d %d %d %d", &x, &in, &out, &n);
            if(in < s) in = s;
            if(out > e) out =e;
            for(b = in; b <= out; b++)    time[b]++;
            while(n--) {
                scanf("%d %s", &buy, item);
                if(buy >= s && buy <= e)
                    p[item[0] - 'A'] ++;
            }
        }
        int max = 0;
        for(a = s; a <= e; a++) {
            max = (max > time[a]) ? max : time[a];
        }
        printf("%d\n", max);
        for(a = s; a <= e+1; a++) {
            if(time[a] == max) {
                if(a != 0) {
                    if(time[a] != time[a-1])
                        printf("%d ", a);
                }
            }
            if(a != 0) {
                if(time[a-1] == max && time[a] != max)
                    printf("%d ", a-1);
            }
        }
        puts(""), max = 0;
        for(a = 0; a < 26; a++)
            max = (max > p[a]) ? max : p[a];
        if(max == 0) puts("?");
        else {
            for(a = 0; a < 26; a++)
                if(p[a] == max)
                    printf("%c ", a+'A');
            puts("");
        }
    }
    return 0;
}