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
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 ;
T1:
宽搜妥妥的,注意queue数组开3倍
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #define MAXN 100005 6 using namespace std; 7 int b[MAXN]; 8 int n,k; 9 int qL[3*MAXN],qM[3*MAXN],L=1,R; 10 void bfs(){ 11 qL[++R]=n; 12 qM[R]=0; 13 while(L<=R){ 14 int x=qL[L],p=qM[L]; 15 if(x==k){ 16 return; 17 } 18 L++; 19 int dx=x+1; 20 if(0<=dx&&dx<MAXN&&!b[dx]){ 21 b[dx]=p+1; 22 qL[++R]=dx; 23 qM[R]=b[dx]; 24 } 25 dx=x-1; 26 if(0<=dx&&dx<MAXN&&!b[dx]){ 27 b[dx]=p+1; 28 qL[++R]=dx; 29 qM[R]=b[dx]; 30 } 31 dx=x*2; 32 if(0<=dx&&dx<MAXN&&!b[dx]){ 33 b[dx]=p+1; 34 qL[++R]=dx; 35 qM[R]=b[dx]; 36 } 37 } 38 } 39 int main() 40 { 41 // freopen("data.in","r",stdin); 42 scanf("%d%d",&n,&k); 43 bfs(); 44 printf("%d\n",b[k]); 45 return 0; 46 }