1. 程式人生 > >NOIP2016普及組複賽解題報告

NOIP2016普及組複賽解題報告

買鉛筆
【題目描述】
P老師需要去商店買n支鉛筆作為小朋友們參加NOIP的禮物。她發現商店一共有 3種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,價格也有可能不同。為了公平起 見,P老師決定只買同一種包裝的鉛筆。
商店不允許將鉛筆的包裝拆開,因此P老師可能需要購買超過n支鉛筆才夠給小朋 友們發禮物。
現在P老師想知道,在商店每種包裝的數量都足夠的情況下,要買夠至少n支鉛筆最少需要花費多少錢。
【輸入格式】
輸入的第一行包含一個正整數n,表示需要的鉛筆數量。
接下來三行,每行用兩個正整數描述一種包裝的鉛筆:其中第一個整數表示這種 包裝內鉛筆的數量,第二個整數表示這種包裝的價格。
保證所有的7個數都是不超過10000的正整數。
【輸出格式】
輸出一行一個整數,表示P老師最少需要花費的錢。
【樣例輸入】
57
2 2
50 30
30 27
【樣例輸出】
54
【分析】
水題,直接模擬即可。(可是我錯了,教練不要打死我就行)

迴文日期
【題目描述】
在日常生活中,通過年、月、日這三個要素可以表示出一個唯一確定的日期。 牛牛習慣用8位數字表示一個日期,其中,前4位代表年份,接下來2位代表月 份,最後2位代表日期。顯然:一個日期只有一種表示方法,而兩個不同的日期的表 示方法不會相同。
牛牛認為,一個日期是迴文的,當且僅當表示這個日期的8位數字是迴文的。現 在,牛牛想知道:在他指定的兩個日期之間包含這兩個日期本身),有多少個真實存 在的日期是迴文的。
一個8位數字是迴文的,當且僅當對於所有的i ( 1 <=i<= 8 )從左向右數的第i個 數字和第9-i個數字(即從右向左數的第i個數字)是相同的。
例如:
•對於2016年11月19日,用8位數字20161119表示,它不是迴文的。
•對於2010年1月2日,用8位數字20100102表示,它是迴文的。
•對於2010年10月2日,用8位數字20101002表示,它不是迴文的。
每一年中都有12個月份: 其中,1、3、5、7、8、10、12月每個月有31天;4、6、9、11月每個月有30天;而對於2月,閏年時有29天,平年時有28天。
一個年份是閏年當且僅當它滿足下列兩種情況其中的一種:
1.這個年份是4的整數倍,但不是100的整數倍;
2.這個年份是400的整數倍。
例如:
•以下幾個年份都是閏年:2000、2012、2016。
•以下幾個年份是平年:1900、2011、2014。
【輸入格式】
輸入包括兩行,每行包括一個8位數字。
第一行表示牛牛指定的起始日期。
第二行表示牛牛指定的終止日期。
保證date_i和都是真實存在的日期,且年份部分一定為4位數字,且首位數字不為0。
保證date1 —定不晚於date2。
【輸出格式】
輸出一行,包含一個整數,表示在date1和date2之間,有多少個日期是迴文的。
【樣例輸入】
20000101
20101231
【樣例輸出】
2
【分析】
迴文數的前一半確定後,則整個迴文數也就確定了。故列舉年份,直接可以得出與該年份構成迴文的月和日,然後直接判斷即可。

海港
【題目描述】
小K是一個海港的海關工作人員,每天都有許多船隻到達海港,船上通常有很多來自不同國家的乘客。
小K對這些到達海港的船隻非常感興趣,他按照時間記錄下了到達海港的每一艘船隻情況;對於第i艘到達的船,他記錄了這艘船到達的時間ti (單位:秒),船上的乘 客數星ki,以及每名乘客的國籍 x(i,1), x(i,2),…,x(i,k);。
小K統計了n艘船的資訊,希望你幫忙計算出以每一艘船到達時間為止的24小時(24小時=86400秒)內所有乘船到達的乘客來自多少個不同的國家。
形式化地講,你需要計算n條資訊。對於輸出的第i條資訊,你需要統計滿足 ti - 86400 < tp <= ti的船隻p,在所有的x(p,j)中,總共有多少個不同的數。
【輸入格式】
第一行輸入一個正整數n,表示小K統計了 n艘船的資訊。
接下來n行,每行描述一艘船的資訊:前兩個整數ti和ki分別表示這艘船到達海港的時間和船上的乘客數量,接下來ki個整數x(i,j)表示船上乘客的國籍。
保證輸入的ti是遞增的,單位是秒;表示從小K第一次上班開始計時,這艘船在第 ti 秒到達海港。
【輸出格式】
輸出n行,第i行輸出一個整數表示第i艘船到達後的統計資訊。
【樣例輸入】
3
1 4 4 1 2 2
2 2 2 3
10 1 3
【樣例輸出】
3
4
4
【資料範圍】
對於70%的資料,1<=n<=1000,所有ki之和<=3000,1<=Xi,j<=1000,1<=ti<=10^9
對於100%的資料,1<=n<=100000,所有ki之和<=300000,1<=Xi,j<=100000,1<=ti<=10^9
【分析】
為了不爆空間,可以邊讀入邊處理,只能開一維陣列。

魔法陣
【題目描述】
六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。
大魔法師有m個魔法物品,編號分別為1,2,…,m。每個物品具有一個魔法值,我們用Xi表示編號為i的物品的魔法值。每個魔法值Xi是不超過n的正整數,可能有多個物品的魔法值相同。
大魔法師認為,當且僅當四個編號為a,b,c,d的魔法物品滿足xa< xb< xc< xd,Xb-Xa=2(Xd-Xc),並且xb-xa<(xc-xb)/3時,這四個魔法物品形成了一個魔法陣,他稱這四個魔法物品分別為這個魔法陣的A物品,B物品,C物品,D物品。
現在,大魔法師想要知道,對於每個魔法物品,作為某個魔法陣的A物品出現的次數,作為B物品的次數,作為C物品的次數,和作為D物品的次數。
【輸入格式】
第一行包含兩個空格隔開的正整數n和m。
接下來m行,每行一個正整數,第i+1行的正整數表示Xi,即編號為i的物品的魔法值。
【輸出格式】
共輸出m行,每行四個整數。第i行的四個整數依次表示編號為i的物品作 為A,B,C,D物品分別出現的次數。
【樣例輸入】
30 8
1
24
7
28
5
29
26
24
【樣例輸出】
4 0 0 0
0 0 1 0
0 2 0 0
0 0 1 1
1 3 0 0
0 0 0 2
0 0 2 2
0 0 1 0
【資料範圍】
1<=n<=15000
1<=m<=40000
【分析】
這幾乎就是一個數學問題。
令x=d-c(這裡的c和d表示題目中的Xc和Xd,為了方便下文均使用下標代替)。
首先可以推出1<=x<=n div 9
然後由Xb-Xa=2(Xd-Xc)可以知道b-a=2x
得出a,代入xb-xa<(xc-xb)/3可得c-b>6x
不難得出b=a+2x,c=a+8x+k(這裡的k是一個正整數),d=a+9x+k
於是直接列舉,然後就是統計咯。
注意:下面給的程式中的變數含義可能與分析中的不一樣,請結合註釋理解。

總結:這次考試的AC程式碼幾乎都很短,但是也很難寫出來。縱觀整套試題,幾乎沒有考到多少演算法,全都是各種程式設計技巧和思維。所以從這一點來看,NOIP2016比前幾年稍難一些。