2014-5-16 NOIP模擬賽
Problem 1 抓牛(catchcow.cpp/c/pas)
【題目描述】
農夫約翰被通知,他的一只奶牛逃逸了!所以他決定,馬上出發,盡快把那只奶牛抓回來.
他們都站在數軸上.約翰在N(O≤N≤100000)處,奶牛在K(O≤K≤100000)處.約翰有兩種辦法移動,步行和瞬移:步行每秒種可以讓約翰從x處走到x+l或x-l處;而瞬移則可讓他在1秒內從x處消失,在2x處出現.然而那只逃逸的奶牛,悲劇地沒有發現自己的處境多麽糟糕,正站在那兒一動不動.
那麽,約翰需要多少時間抓住那只牛呢?
【輸入格式】
僅有兩個整數N和K
【輸出格式】
最短時間
【樣例輸入】
5 17
【樣例輸出】
4
/* 寬搜,有點像spfa */ #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define maxn 100010 int dis[maxn],N,K,mx; queue<int>q; bool vis[maxn]; void bfs(){ memset(dis,127/3,sizeof(dis)); q.push(N); dis[N]=0; vis[N]=1; while(!q.empty()){ int now=q.front();q.pop(); if(now>0&&dis[now-1]>dis[now]+1){ dis[now-1]=dis[now]+1; if(now-1==N)return; if(!vis[now-1]){ vis[now-1]=1; q.push(now-1); } }if(now+1<=mx&&dis[now+1]>dis[now]+1){ dis[now+1]=dis[now]+1; if(now+1==N)return; if(!vis[now+1]){ vis[now+1]=1; q.push(now+1); } } if(now*2<=mx&&dis[now*2]>dis[now]+1){ dis[now*2]=dis[now]+1; if(now*2==N)return; if(!vis[now*2]){ vis[now*2]=1; q.push(now*2); } } } } int main(){ freopen("catchcow.in","r",stdin); freopen("catchcow.out","w",stdout); scanf("%d%d",&N,&K); mx=max(N,K)+1; q.push(N); bfs(); printf("%d",dis[K]); }
Problem 2 路面修整(grading.cpp/c/pas)
【題目描述】
FJ打算好好修一下農場中某條凹凸不平的土路。按奶牛們的要求,修好後的路面高度應當單調上升或單調下降,也就是說,高度上升與高度下降的路段不能同時出現在修好的路中。 整條路被分成了N段,N個整數A_1, ... , A_N (1 <= N <= 2,000)依次描述了每一段路的高度(0 <= A_i <= 1,000,000,000)。FJ希望找到一個恰好含N個元素的不上升或不下降序列B_1, ... , B_N,作為修過的路中每個路段的高度。由於將每一段路墊高或挖低一個單位的花費相同,修路的總支出可以表示為: |A_1 - B_1| + |A_2 - B_2| + ... + |A_N - B_N| 請你計算一下,FJ在這項工程上的最小支出是多少。FJ向你保證,這個支出不會超過2^31-1。
【輸入格式】
第1行: 輸入1個整數:N * 第2..N+1行: 第i+1行為1個整數:A_i
【輸出格式】
第1行: 輸出1個正整數,表示FJ把路修成高度不上升或高度不下降的最小花費
【樣例輸入】
7
1
3
2
4
5
3
9
【樣例輸出】
3
【樣例解釋】
FJ將第一個高度為3的路段的高度減少為2,將第二個高度為3的路段的高度增加到5,總花費為|2-3|+|5-3| = 3,並且各路段的高度為一個不下降序列 1,2,2,4,5,5,9。
Problem 3 教主的魔法(magic.cpp/c/pas)
【題目描述】
教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給XMYZ信息組每個英雄看。於是N個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1、2、……、N。
每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間[L, R](1≤L≤R≤N)內的英雄的身高全部加上一個整數W。(雖然L=R時並不符合區間的書寫規範,但我們可以認為是單獨增加第L(R)個英雄的身高)
CYZ、光哥和ZJQ等人不信教主的邪,於是他們有時候會問WD閉區間 [L, R] 內有多少英雄身高大於等於C,以驗證教主的魔法是否真的有效。
WD巨懶,於是他把這個回答的任務交給了你。
【輸入格式】
第1行為兩個整數N、Q。Q為問題數與教主的施法數總和。
第2行有N個正整數,第i個數代表第i個英雄的身高。
第3到第Q+2行每行有一個操作:
(1)若第一個字母為“M”,則緊接著有三個數字L、R、W。表示對閉區間 [L, R] 內所有英雄的身高加上W。
(2)若第一個字母為“A”,則緊接著有三個數字L、R、C。詢問閉區間 [L, R] 內有多少英雄的身高大於等於C。
【輸出格式】
對每個“A”詢問輸出一行,僅含一個整數,表示閉區間 [L, R] 內身高大於等於C的英雄數。
【樣例輸入】
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
【樣例輸出】
2
3
【數據範圍】
【輸入輸出樣例說明】
原先5個英雄身高為1、2、3、4、5,此時[1, 5]間有2個英雄的身高大於等於4。教主施法後變為1、2、4、5、6,此時[1, 5]間有3個英雄的身高大於等於4。
【數據範圍】
對30%的數據,N≤1000,Q≤1000。
對100%的數據,N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000
Problem 4 吃豆豆(pacman.cpp/c/pas)
【問題描述】
兩個PACMAN吃豆豆。一開始的時候,PACMAN都在坐標原點的左下方,豆豆都在右上方。PACMAN走到豆豆處就會吃掉它。PACMAN行走的路線很奇怪,只能向右走或者向上走,他們行走的路線不可以相交。
請你幫這兩個PACMAN計算一下,他們兩加起來最多能吃掉多少豆豆。
【輸入文件】
第一行為一個整數N,表示豆豆的數目。接下來N行,每行一對正整數Xi,Yi,表示第i個豆豆的坐標。任意兩個豆豆的坐標都不會重合。
【輸出文件】
僅有一行包含一個整數,即兩個PACMAN加起來最多能吃掉的豆豆數量。
【輸入樣例】
8
8 1
1 5
5 7
2 2
7 8
4 6
3 3
6 4
【輸出樣例】
7
【數據規模】
對於30%的數據,1<=N<=25;
對於70%的數據,1<=N<=500;
對於100%的數據,1<=N<=2000,1<=Xi ,Yi <=200000 ;
2014-5-16 NOIP模擬賽