【NOIP模擬】序列
Description
Solution
這道題有兩個方法。
方法1:差分加貪心
首先可以求出每個點從a[i]到b[i]的步數c[i]。
然後處理出兩兩之間的差分d[i]。顯然在不調整之前(加4),答案的值是
那麼假設現在對區間[l,r]的每個數加4,那麼對於差分的影響,只會影響到l和l-1的差分還有r和r+1之間的差分。
如果現在這裡差分有一個3(或2),那麼需要在前面找一個-3或-2,因為這樣加4之後可以讓max(差分,0)更小,而且因為中間的高度已經被兩邊抵消了,所以加4不會產生新的貢獻。
然後
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=100007;
int i,j,k,l,t,n,m,ans,cas,r,da,da1,ans1,ans2[maxn];
int a[maxn],b[maxn],c[maxn],d[maxn],yi,er;
int f[maxn][11],g[maxn][11];
int main(){
for(scanf("%d",&cas);cas;cas--){
scanf("%d",&n);
fo(i,1,n)scanf("%d",&a[i]);
fo(i,1,n)scanf("%d",&k),c[i]=(k-a[i]+4)%4;
fo(i,1,n)d[i]=c[i]-c[i-1];
yi=er=ans=0;
fo(i,1,n)ans+=max(0,d[i]);
fo(i,1 ,n){
switch(d[i]){
case -3:yi++;break;
case -2:er++;break;
case 1:break;
case 0:break;
case -1:break;
case 3:{
if(yi)yi--,ans-=2;
else if(er)ans--,er--;
break;
}
case 2:{
if(yi)ans--,yi--,er++;
break;
}
}
}
printf("%d\n",ans);
}
}
方法2:帶證明的優美的DP
設f[i][j]表示i這個位加j次4的最小值。
轉移很顯然,是一個水DP。
但是j的值域怎麼辦?
事實上,j開到5就好了,可以用上面的差分證明,因為有5中情況,疊在一起,同一個位置最多加5次4。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=100007;
int i,j,k,l,t,n,m,ans,cas,r,da,da1;
int a[maxn],b[maxn],c[maxn];
int f[maxn][6];
bool bz,az;
int chu(int x,int y){
if(x<=y)return y-x;
else return (4-x)+y;
}
int main(){
// freopen("fan.in","r",stdin);
for(scanf("%d",&cas);cas;cas--){
scanf("%d",&n);
fo(i,1,n)scanf("%d",&a[i]);
da=0;
fo(i,1,n)scanf("%d",&b[i]),c[i]=chu(a[i],b[i]);
memset(f,127,sizeof(f));
f[0][0]=0;
fo(i,1,n){
fo(j,0,5){
fo(k,0,5){
if(c[i]+j*4<=c[i-1]+k*4)f[i][j]=min(f[i][j],f[i-1][k]);
else f[i][j]=min(f[i][j],f[i-1][k]+abs((c[i]+j*4)-(c[i-1]+k*4)));
}
}
}
ans=0x7fffffff;
fo(i,0,5)ans=min(f[n][i],ans);
printf("%d\n",ans);
}
}
相關推薦
【NOIP模擬】序列
Description Solution 這道題有兩個方法。 方法1:差分加貪心 首先可以求出每個點從a[i]到b[i]的步數c[i]。 然後處理出兩兩之間的差分d[i]。顯然在不
【NOIP模擬】斐波那契+序列+柵欄
T1: Hash 程式碼(map實現): #include <bits/stdc++.h> #include <tr1/unordered_map> using namespace std; using namespace std:
【noip模擬】連環
!= ++ emc def lib 長度 似的 sof 答案 【題目描述】 惠子說:“連環可解也”。 這說明他是一個破解機關的高手,連連環都能解開,魯班鎖什麽的自然不在話下。一位魯班的後人非常不服氣,於是找到惠子,給他出了一道題。 他首先給了惠子
【noip模擬】德充符
amp 時間限制 一行 我們 但是 i++ 如果 time shuffle 時間限制:2s 內存限制:512MB 【題目描述】 申徒嘉和鄭子產都是伯昏無人的學生,子產因為申徒嘉是殘疾人,非常看不起他,於是想要刁難他。 子產給了申徒嘉 n個數 a1,a2...an。 現在他
【noip模擬】Fantasia
show line sum 後繼 模擬 什麽 問題 %d ide Time Litmit: 1000ms Memory Limit: 256MB Description 給定一張 $N$ 個點、$M$ 條邊的無向圖 $G$ 。每個點有個權值$W_i$。 我們
【noip模擬】最小點覆蓋
mes 都是 ons mar 長度 最小 一句話 標記 com Time Limit: 1000ms Memory Limit: 128MB Description 最小點覆蓋是指在二分圖中,用最小的點集覆蓋所有的邊。當然,一個二分圖的最小點覆蓋可能有很多
【noip模擬】2048
ans align span 模擬 現在 tdi ring 最大 說我 Time limit: 1000ms Memory limits: 256MB Description 2048曾經是一款風靡全球的小遊戲。今天,我們換一種方式來玩這個小遊戲。現在
【noip模擬】D(==)
Portal --> who knows == Description 數軸上面有一些洞,有一些老鼠,每個洞有一個容量限制,一隻位於\(x\)的老鼠進到位於\(y\)的洞要花費\(|x-y|\)的代價,問所有老鼠都進洞的最小代價,如果沒有合法方案輸出\(-1\) 資料範圍:\(n,m<=
【NOIP模擬】距離
題面 對夢想的持續追求讓實力本身很弱的David一天天變強。他最終考上了自己所喜歡的大學。北京有啥好大學想必大家都比我清楚吧。 成都到北京之間有 座城市,城市和城市之間由 條雙向通行的道路相連,城市和城市之間兩兩可達。通過第條道路需要交納 的過路費。Acid公司很喜歡有夢想的年輕人,他們決定對前往高校上學
【NOIP模擬】指引
題面 N 名迷途的旅者需要小 X 的指引。 初始時,每一名旅者 i 位於座標(Ai,Bi)處,旅者們只能夠向右或是向上移動. 也就是說,他們只能夠增加自己的某一維座標,而不能減小它們。 這片大地上同樣存在者 N 個出口,每一個出口 i 位於座標(Ci,Di)處,一個出一旦被某個旅者通過,它們就會一併消
【NOIP模擬】購物
題面 雙11就要來啦!Yuno 剛剛獲得了X 元的獎金。那麼是不是應該清空下購物車呢?購物車總共有 N 個物品,每個物品的價格為 Vi ,Yuno 想盡可能地把獎金給花光,所以她要精心選擇一些商品,使得其價格總和最接近但又不會超過獎金的金額。那麼 Yuno 最後最少可以剩下多少錢呢? 10% 的資料:N
【NOIP模擬】怪獸
題面 大 M 是一隻怪獸,準備到位元王國吃人。位元王國有 n 個城市,城市之間由 n-1 條無向的路徑連線,通過每條路徑的時間為 1。其中有 m 個特別的城市,這 m 個 城市裡都各有一個大神,於是大 M 打算不管普通人,只吃掉這些大神。然而大 M 是 一隻具有特別能力的怪物,它可以一開始降臨到 n 個城市
【NOIP模擬】方格稿紙
題面 小 y 終於在小學學會了一些字、詞、句子, 會寫一點作文了。某一天,小 y 買 了一張方格稿紙來寫作文, 稿紙是 n 行 m 列的,形狀如下所示(圖中 n=m=5): 某天小 y 的鄰居小 x 來小 y 家玩, 無聊地用黑墨水筆把小 y 新買的方格稿紙 塗黑了很多格子。每個格子不是完全黑色就是完
【NOIP模擬】聚會
聚會 描述 在成都的一條街道上,一共有 NN戶人家,每個家庭有 XiXi 個人,他們和諧的生活在 一起,作為全國和諧街道,他們經常會小範圍組織活動,每次活動會選擇一戶
2018.10.02【校內模擬】序列維護(分塊)(廣義尤拉定理)
【描述】 ~沒有題面, 非常友好~ 給出一個長度為 n 的序列, 每個位置有個數字 Ai,有 2 個操作: 1、區間修改,將[L,R]區間的數字加上一個數 2、區間查詢[l,r] 查詢alal+1al+2...armodpa_l^{a_{l+1}^{a_{l+2
【NOIP模擬】K進位制+排隊+航班
K進位制 描述 給定一個K(2<=K<=16)進位制數a,判斷a是否能被K-1整除。 輸入 第一行是一個整數t(1<=t<=50),表示測
【NOIP模擬】棋盤問題
題目:棋盤問題 解析: 切比雪夫距離轉曼哈頓距離。 於是字首和,於是題解。。。 程式碼: #include <bits/stdc++.h> #d
【NOIP模擬】發電機
題目:發電機 解析: 每個點出現的概率為,求和即可。 程式碼: #include <bits/stdc++.h> using namespace std; co
【NOIP模擬】加密+硬幣+位元戰爭
T1: 其實直接轉成陣列模擬是可過的。。。 正解: 程式碼: #include <bits/stdc++.h> using namespace std
【NOIP模擬】貨物運輸
題目描述 南沙群島有N個島嶼上駐紮有解放軍邊防部隊。每個島嶼的位置用一個平面座標(Xi,Yi)來表示,島嶼間的行程費用被認為是兩者間的距離。例如,兩個點(X1,Y1),(X2,Y2),它們的直線距離為: 。 軍隊基地在座標為(0,0)的島嶼裡面,基地存放了常用的生活物