1. 程式人生 > >NOIP2018Day1!!!題目出爐!!!

NOIP2018Day1!!!題目出爐!!!

今天是NOIP2018 Day1的日子,小編作為學生黨,也參加了NOIP。

自測100,太爛了QAQ

希望明天發揮正常。

下面來給題目和我的思路。

T1

鋪設道路

題目描述

春春是一名道路工程師,負責鋪設一條長度為 n的道路。

鋪設道路的主要工作是填平下陷的地表。整段道路可以看作是 n 塊首尾相連的區 域,一開始,第 i 塊區域下陷的深度為 di 。 春春每天可以選擇一段連續區間[L,R]  ,填充這段區間中的每塊區域,讓其下陷深 度減少 1。在選擇區間時,需要保證,區間內的每塊區域在填充前下陷深度均不為 0 。 春春希望你能幫他設計一種方案,可以在最短的時間內將整段道路的下陷深度都變 為 0

輸入輸出格式

輸入格式:

輸入檔案包含兩行,第一行包含一個整數 n,表示道路的長度。 第二行包含 n 個整數,相鄰兩數間用一個空格隔開,第 個整數為 di

輸出格式:

輸出檔案僅包含一個整數,即最少需要多少天才能完成任務。

輸入輸出樣例

輸入樣例#1:
6   
4 3 2 5 3 5 
輸出樣例#1:
9

說明

一種可行的最佳方案是,依次選擇: [1,6][1,6][1,2]、[1,1[4,6][4,4][4,4][6,6][6,6。 對於 30%30\%30% 的資料,1≤n≤10 ; 對於 70%70\%70% 的資料,1≤n≤1000; 對於 100%100\%100% 的資料,1≤n≤100000,0≤di≤10000

QAQ,其實還蠻簡單的。

我是這樣想的:

首先,樣例解釋告訴我們:儘量一次填坑選最大的區間。讓我們來模擬一下:

我們每次記錄一下最小值,Ans就累加min,在把所有區間的數減min,再以min的編號為中間點,向兩邊遞迴,是一個很類似二分的演算法。

下面我們來付上程式碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a[100010];
 4 int ans=0;
 5 int Read()
 6 {
 7     char a=getchar();
 8     int f=1,r=0;
 9     while
(a<'0'||a>'9') 10 { 11 if(a=='-') 12 f=-1; 13 a=getchar(); 14 } 15 while(a<='9'&&a>='0') 16 { 17 r=r*10+a-'0'; 18 a=getchar(); 19 } 20 return r*f; 21 }//讀入優化,可刪去 22 void search(int left,int right) 23 { 24 if(right<left) 25 return; 26 int minn=0x3f3f3f3f,mid; 27 for(int i=left;i<=right;i++) 28 { 29 if(minn>a[i]) 30 { 31 minn=a[i]; 32 mid=i; 33 } 34 } 35 ans+=minn; 36 for(int i=left;i<=right;i++) 37 a[i]-=minn; 38 search(left,mid-1); 39 search(mid+1,right); 40 }//二分搜尋 41 int main() 42 { 43 n=Read(); 44 for(int i=1;i<=n;i++) 45 a[i]=Read(); 46 search(1,n); 47 cout<<ans<<endl; 48 return 0; 49 }

這其實就完了,大家可以在 NOIP2018提高自測 測評自己的程式碼。

但是,考試結束後,我意識到了一點,點開下面的連結,仔細對比,你也懂。

QAQ

不懂得私信。

T2

貨幣系統

題目描述

在網友的國度中共有 n種不同面額的貨幣,第 i 種貨幣的面額為 a[i],你可以 假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n、面額陣列為 a[1..n] 的貨幣系統記作 (n,a)

在一個完善的貨幣系統中,每一個非負整數的金額 x都應該可以被表示出,即對 每一個非負整數 x,都存在 n個非負整數 t[i]滿足 a[i]×t[i]的和為 x。然而, 在網友的國度中,貨幣系統可能是不完善的,即可能存在金額 x 不能被該貨幣系統表示出。例如在貨幣系統 n=3, a=[2,5,9] 中,金額 1,3 就無法被表示出來。

兩個貨幣系統 (n,a)(m,b) 是等價的,當且僅當對於任意非負整數 x,它要 麼均可以被兩個貨幣系統表出,要麼不能被其中任何一個表出。

現在網友們打算簡化一下貨幣系統。他們希望找到一個貨幣系統 (m,b),滿足 (m,b) 與原來的貨幣系統 (n,a) 等價,且 m儘可能的小。他們希望你來協助完成這個艱鉅的任務:找到最小的 m

輸入輸出格式

輸入格式:

輸入檔案的第一行包含一個整數 T,表示資料的組數。

接下來按照如下格式分別給 出 T 組資料。 每組資料的第一行包含一個正整數 n。接下來一行包含 n 個由空格隔開的正整數 a[i]

輸出格式:

輸出檔案共有 T行,對於每組資料,輸出一行一個正整數,表示所有與 (n,a) 等價的貨幣系統 (m,b)中,最小的 m

輸入輸出樣例

輸入樣例#1: 複製
2 
4 
3 19 10 6 
5 
11 29 13 19 17 
輸出樣例#1: 複製
2   
5  

其實,這道題也不難,思路我在賽後才想出來,於是也沒寫程式碼。

這就是一個完全揹包問題!!!

一個數可以選多次,要滿足和為一個數!

當時我在考場上怎麼沒想到啊QAQ

我實在是沒辦法。只能在心裡無助的呼喊。

最後一題

不會QAQ

我太弱了,畢竟還有很大的學習空間,這一題我是一點思路都沒有,如果我沒有脈動——仙人掌口味,就撐不到現在了QAQ

上題目吧。

這裡我真的無話可說,希望大佬幫幫蒟蒻,提供一個解答,不勝感激。

T3

賽道修建

題目描述

C 城將要舉辦一系列的賽車比賽。在比賽前,需要在城內修建 m 條賽道。 

C 城一共有 n 個路口,這些路口編號為 1,2,…,n,有 n−1條適合於修建賽道的雙向通行的道路,每條道路連線著兩個路口。其中,第 iii 條道路連線的兩個路口編號為 aibi,該道路的長度為 li。藉助這 n−1 條道路,從任何一個路口出發都能到達其他所有的路口。

一條賽道是一組互不相同的道路 e1,e2,…,ek,滿足可以從某個路口出發,依次經過 道路 e1,e2,…,ek(每條道路經過一次,不允許調頭)到達另一個路口。一條賽道的長度等於經過的各道路的長度之和。為保證安全,要求每條道路至多被一條賽道經過。 

目前賽道修建的方案尚未確定。你的任務是設計一種賽道修建的方案,使得修建的 m 條賽道中長度最小的賽道長度最大(即 m條賽道中最短賽道的長度儘可能大)

輸入輸出格式

輸入格式:

輸入檔案第一行包含兩個由空格分隔的正整數 n,m,分別表示路口數及需要修建的 賽道數。

接下來 n−1行,第 iii 行包含三個正整數 ai,bi,li,表示第 i條適合於修建賽道的道 路連線的兩個路口編號及道路長度。保證任意兩個路口均可通過這 n−1條道路相互到達。每行中相鄰兩數之間均由一個空格分隔。

輸出格式:

輸出共一行,包含一個整數,表示長度最小的賽道長度的最大值。

輸入輸出樣例

輸入樣例#1:
7 1 
1 2 10 
1 3 5 
2 4 9 
2 5 8 
3 6 6 
3 7 7
輸出樣例#1:
31
輸入樣例#2:
9 3 
1 2 6 
2 3 3 
3 4 5 
4 5 10 
6 2 4 
7 2 9 
8 4 7 
9 4 4
輸出樣例#2:
15

說明

【輸入輸出樣例 1 說明】

所有路口及適合於修建賽道的道路如下圖所示: 道路旁括號內的數字表示道路的編號,非括號內的數字表示道路長度。 需要修建 1條賽道。可以修建經過第 3,1,2,6 條道路的賽道(從路口 4 到路口 7), 則該賽道的長度為 9+10+5+7=31,為所有方案中的最大值。

【輸入輸出樣例 2 說明】

所有路口及適合於修建賽道的道路如下圖所示: 需要修建 3條賽道。可以修建如下