NOIP模拟赛
T1
1.聰明的小偷
?(thief.pas/c/cpp)
【問題描述】
從前有一個收藏家收藏了許多相同的硬幣,并且將它們放在了n個排成一排的口袋里,每個口袋里都裝了一定數量的硬幣。
這些硬幣價值不菲,自然引起不少人覬(ji,4)覦(yu,2),于是收藏家每天都會來檢查一次這n個口袋,首先他會先檢查每個口袋是不是都有硬幣,之后他會計算出第1個和第2個口袋的硬幣數量之和,第2個與第3個口袋的硬幣數量和,如此直到第n-1個與第n個口袋的硬幣數量之和,得到n-1個數的序列。
如果收藏家發現某個口袋沒有硬幣,或者他計算得到的序列較上一天相比有變動,那么收藏家就知道肯定有人動了他的硬幣。
有一個聰明的小偷,他想在收藏家不知道的情況下偷走一些硬幣,為此,他不僅可以偷偷地從某個口袋中拿出一些硬幣,也可以將硬幣在口袋間任意移動,現在他想知道對于給定的n個口袋及對應的硬幣數量,他最多能拿多少枚硬幣。
小偷是很聰明的,他早就算出來啦,但是他想考考作為徒弟的你……
?
【數據規模與約定】
????對于50%的數據,有2≤n≤20,每個口袋中硬幣數量≤20。
????對于100%的數據,有2≤n≤999,每個口袋中硬幣數量≤10000且為正整數。
?
貪心提,自己造了幾組數據,連蒙帶猜找到規律就可以了
當n為偶數時,答案一定為 0,當 n為奇數時,答案為所有編號為奇數的口袋中硬幣數量的最小值 -1。
注:n<=3時奇數也不行
?
?
?
T2
?
?
2.無名
?(noname.pas/c/cpp)
【問題描述】
????這道題實在不知道該取什么名字比較好,于是就取了這個名字。
????給定一個長度為n的正整數序列,你的任務就是求出至少需要修改序列中的多少個數才能使得該數列成為一個嚴格(即不允許相等)單調遞增的正整數序列,對序列中的任意一個數,你都可以將其修改為任意的正整數。
?
【數據規模與約定】
對于30%的數據,有1≤n≤10。
對于80%的數據,有1≤n,T≤50,且輸入序列中每個數均不超過50。
對于100%的數據,有1≤n≤50000,1≤T≤5000,輸入序列中每個數均為不超過1000000000(10^9)的正整數,且每個測試點中T組數據對應的n值總和不超過500000。
?
看到數據范圍就果斷選擇80分算法
80分:
DP
f[i][j] 代表前i個數最后一位為j時的最小改變策略
?
?
x 表示可以任意數變到的最大值
?
正解:
簡單來說就是:構造序列b[i] = a[i] – i;答案即為序列總長度減去B的最長不下降子序列。
(nlogn)二分優化lis
?
T3
?
?
3.服務
?(service.pas/c/cpp)
【問題描述】
????一家公司為它在各地的用戶提供服務,公司有三名負責這項工作的員工,分別編號為1,2,3,服務的地點有n個,分別編號為1,2,3,...n,把從編號為p的服務地點直接到達編號為q的服務地點所需的移動費用記為C(p,q),顯然C(p,p)=0(停留在原地不需要費用),但不保證對任意p,q均有C(p,q)=C(q,p)。
????初始時員工1在地點1,員工2在地點2,員工3在地點3,現在公司依次收到了L個服務請求,每個請求需要一名員工趕到其指定的地點進行服務,員工可以選擇直達,也可以選擇經過若干個服務地點中轉,特別地,如果指派的員工已在當前請求所在地,則該請求不需要任何移動費用即可被處理。
????出于公平起見,所有請求必須按順序處理,這意味著即使一名員工在趕往當前請求的途中經過之后的請求所在的地點,他也不可以先處理之后的請求,但是公司不限制每位員工趕往請求地點的路線,也允許一個服務地點有多名員工。
????你的任務就是對于這L個請求,找到一個服務方案(即對每個請求分配合適的員工去服務以及規劃移動路線),使得三名員工提供服務的總移動費用最小。
?
【數據規模與約定】
????每個測試點5分,各個測試點數據范圍如下:
| 測試點編號 | n | L |
| 1-3 | ? | ? |
| 4-6 | ? | ? |
| 7-10 | ? | ? |
| 11-14 | ? | ? |
| 15-17 | ? | ? |
| 18-20 | ? | ? |
????對于所有的測試點,均有數據組數,地點數,給定的C矩陣主對角線上的數全部為0,且輸入數據中所有的數均為不超過2000的非負整數。
從考試開始到結束都沒想過4維的DP
打了不知道多長時間的暴力后 果斷放棄提交()
正解:
首先用Floyd求最短路。
4 維 DP f[k][i1][i2][i3] 代表做到第 k 個任務是3人在 i1 i2 i3 時的費用。
5重循環。
優化
因為有任務,所以可已確定完成這個任務前后某個人的位置 完成第 k 個任務前一定有一個人在 b[k1-1] 的位置 完成第 k 個任務后一定有一個人在 p[k1] 的位置。所以就能剩一沖循環了(4重)。
因為可以確定某個人的位置,所以可以再省略一維 i3。i1,i2都不到p[k1]的位值,i3一定就在;i1或 i2到 b[k1]的位值,i3一定就不在;
所以:并列3個核心
注:初始化f[0][1][2]=0;
b[0]=3;
?
轉載于:https://www.cnblogs.com/cylyz/p/9757264.html
總結
- 上一篇: 输卵管堵塞手术多少钱
- 下一篇: Can't create table..