1. 程式人生 > >2014-5-16 NOIP模擬賽

2014-5-16 NOIP模擬賽

悲劇 瞬移 一段 scan esp -1 學會 ret %d

Problem 1 抓牛(catchcow.cpp/c/pas)

【題目描述】

農夫約翰被通知,他的一只奶牛逃逸了!所以他決定,馬上出發,盡快把那只奶牛抓回來.

他們都站在數軸上.約翰在N(O≤N≤100000)處,奶牛在K(O≤K≤100000)處.約翰有兩種辦法移動,步行和瞬移:步行每秒種可以讓約翰從x處走到x+lx-l處;而瞬移則可讓他在1秒內從x處消失,在2x處出現.然而那只逃逸的奶牛,悲劇地沒有發現自己的處境多麽糟糕,正站在那兒一動不動.

那麽,約翰需要多少時間抓住那只牛呢?

【輸入格式】

僅有兩個整數NK

【輸出格式】

最短時間

【樣例輸入】

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個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為12……N

每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間[L, R]1≤L≤R≤N)內的英雄的身高全部加上一個整數W。(雖然L=R時並不符合區間的書寫規範,但我們可以認為是單獨增加第LR)個英雄的身高)

CYZ、光哥和ZJQ等人不信教主的邪,於是他們有時候會問WD閉區間 [L, R] 內有多少英雄身高大於等於C,以驗證教主的魔法是否真的有效。

WD巨懶,於是他把這個回答的任務交給了你。

【輸入格式】

1行為兩個整數NQQ為問題數與教主的施法數總和。

2行有N個正整數,第i個數代表第i個英雄的身高。

3到第Q+2行每行有一個操作:

1)若第一個字母為“M”,則緊接著有三個數字LRW。表示對閉區間 [L, R] 內所有英雄的身高加上W

2)若第一個字母為“A”,則緊接著有三個數字LRC。詢問閉區間 [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個英雄身高為12345,此時[1, 5]間有2個英雄的身高大於等於4。教主施法後變為12456,此時[1, 5]間有3個英雄的身高大於等於4

【數據範圍】

30%的數據,N≤1000Q≤1000

100%的數據,N≤1000000Q≤30001≤W≤10001≤C≤1,000,000,000

Problem 4 吃豆豆(pacman.cpp/c/pas)

【問題描述】

兩個PACMAN吃豆豆。一開始的時候,PACMAN都在坐標原點的左下方,豆豆都在右上方。PACMAN走到豆豆處就會吃掉它。PACMAN行走的路線很奇怪,只能向右走或者向上走,他們行走的路線不可以相交。

請你幫這兩個PACMAN計算一下,他們兩加起來最多能吃掉多少豆豆。

【輸入文件】

第一行為一個整數N,表示豆豆的數目。接下來N行,每行一對正整數XiYi,表示第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模擬賽