1. 程式人生 > 實用技巧 >09-19模擬C組

09-19模擬C組

T0

總的來說有點炸,AC一題,然後有一題水了50%的點。

T1蜈蚣

題目描述

你有C只蜈蚣,每隻蜈蚣有F只腳。冬天來了,要給蜈蚣們穿襪子。抽屜裡有N種顏色的襪子,第i種顏色襪子的數量有a[i]只。對於一隻蜈蚣來說,它所有的腳穿的襪子的顏色必須相同。現在你閉上眼睛,從抽屜裡面隨意拿出X只襪子,你要保證隨意拿出來的X只襪子一定可以滿足所有蜈蚣的需求。那麼X的最小值是多少?如果X不存在,輸出-1。

輸入

第一行,三個整數,C,F,N。1<=C<=50,1<=F<=100,1<=N<=100。
第二行,N個整數,第i個整數是a[i]。1 <= a[i] <= 10000000。

輸出

一個整數。最小的X,如果X不存在,輸出-1。

這道題是一道數學題而我卻沒打出來呵呵(電腦前面坐了一天狀態有點差,下午也沒改出來)。正解也查不到,據說Pascal正解如下

var
        a:array[0..105] of longint;
        n,m,l,i,j,ans,maxi:longint;
function find:longint;
var
        i:longint;
begin
        find:=1;
        for i:=2 to l do
        begin
                if a[i]>a[find] then find:=i;
        end;
end;
begin
        assign(input,'e.in');
        reset(input);
        assign(output,'e.out');
        rewrite(output);
        readln(n,m,l);
        for i:=1 to l do
        begin
                read(a[i]);
        end;
        maxi:=0;
        for i:=1 to n do
        begin
                if i=1 then
                begin
                        for j:=1 to l do
                        begin
                                if a[j]>=m-1 then
                                begin
                                        inc(ans,m-1);
                                        dec(a[j],m-1);
                                end
                                else
                                begin
                                        inc(ans,a[j]);
                                        a[j]:=0;
                                end;
                        end;
                        maxi:=find;
                end
                else
                begin
                        if a[maxi]>=m-1 then
                        begin
                                inc(ans,m-1);
                                dec(a[maxi],m-1);
                        end
                        else
                        begin
                                inc(ans,a[maxi]);
                                a[maxi]:=0;
                        end;
                        maxi:=find;
                end;
                if a[maxi]=0 then
                begin
                        writeln(-1);
                        halt;
                end;
                dec(a[maxi]);
                inc(ans);
        end;
        writeln(ans);
        close(input);
        close(output);
end.

對著打了一遍沒打出來。

T2白板

這道題就比較簡單,用模擬六種情況就可以了。

T3序列

題目描述

PYWBKTDA最近在研究一些有趣的數列。
他給你一個無窮序列”112123123412345…”。這個序列是這麼構造的,我們先寫出1到1的所有整
數,然後寫出1到2的所有整數,然後寫出1到3的所有整數,這樣不斷重複進行到無窮。
例如現在前56個數字組成的序列是:
”11212312341234512345612345671234567812345678912345678910”。
我們把序列裡面的每個數字從1開始編號,比如編號為1的數字就是1,編號為2的數字也是1,編號
為3的數字是2,編號為20的數字是5,編號為38的數字是2,編號56的數字是0.
現在你的任務是對於題目給出的q個詢問,每個詢問是k i ,表示問你編號為k i 的數字是多少。

輸入

第一行是整數q,表示詢問的數量。
接下來i行,每行一個整數,表示k i 。

輸出
輸出共計有q行,第i行的輸出表示對應的k i 的詢問,顯然,每個答案都在0到9之間。

這道題就很傷,資料有10^18這麼大。

T4遊戲

PYWBKTDA很喜歡玩一些遊戲,比如算21點。他最近迷上了一款彈珠遊戲。
有n個彈珠排成一排,第i個彈珠的顏色是a i 。 PYWBKTDA喜歡把這些彈珠重新排列,使得相
同顏色彈珠都在同一個連續區間。也就是說,如果PYWBKTDA想要把顏色i的全部放在一起,那
麼顏色i彈珠的最左邊的位置是l,最右邊的位置是r,那麼所有顏色為i的彈珠的位置只能在l到r之間,
l到r範圍內也只能有顏色i的彈珠。
為了達到這個目的,PYWBKTDA將進行如下操作:找到兩個相鄰的彈珠,把它們交換一下位
置。
現在你的任務是來計算最小的交換次數,使得相同顏色彈珠都在同一區間,在這個區間內,同
種顏色的彈珠的位置是無關緊要的。

輸入

輸入的第一行是一個整數n,表示彈珠的數量。
輸入的第二行有n個整數a i ,表示第i個位置上彈珠的顏色。

輸出

輸出只有一個整數,表示最少的交換次數。

正解好像是狀壓dp+n逆序對統計,暴力只有20%,但是我一個都沒打出來。