1. 程式人生 > >【NOIP模擬】序列

【NOIP模擬】序列

Description

這裡寫圖片描述

Solution

這道題有兩個方法。

方法1:差分加貪心

首先可以求出每個點從a[i]到b[i]的步數c[i]。
然後處理出兩兩之間的差分d[i]。顯然在不調整之前(加4),答案的值是max(0,d[i]),畫一下圖就知道了。
那麼假設現在對區間[l,r]的每個數加4,那麼對於差分的影響,只會影響到l和l-1的差分還有r和r+1之間的差分。
如果現在這裡差分有一個3(或2),那麼需要在前面找一個-3或-2,因為這樣加4之後可以讓max(差分,0)更小,而且因為中間的高度已經被兩邊抵消了,所以加4不會產生新的貢獻。
然後O(n)就過去了

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)的島嶼裡面,基地存放了常用的生活物