9.23 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
裸bfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,k,f[];
struct node{
int x,t;
};
queue<node>q;
int Bfs(){
q.push((node){n,});
f[n]=;
while(!q.empty()){
int r=q.front().x;
int p=q.front().t;
q.pop();
if(r==k)return p;
if(r+<=&&f[r+]==){
f[r+]=;q.push((node){r+,p+});
}
if(r->=&&f[r-]==){
f[r-]=;q.push((node){r-,p+});
}
if(r*<=&&f[r*]==){
f[r*]=;q.push((node){r*,p+});
}
}
}
int main()
{
freopen("catchcow.in","r",stdin);
freopen("catchcow.out","w",stdout);
scanf("%d%d",&n,&k);
printf("%d\n",Bfs());
return ;
}
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。
开始想错了后来发现没时间改了... 乱搞40分
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2010
#define inf 0x3f3f3f3f
using namespace std;
int n,a[maxn],b[maxn],c[maxn],d[maxn],r,q[maxn],pre[maxn],A,B,p;
int Abs(int a){
return a<?-a:a;
}
void LIS(){
for(int i=;i<=n;i++){
int x=a[i];
if(x>=c[r]){
pre[i]=q[r];c[++r]=x;
q[r]=i;continue;
}
int p=lower_bound(c+,c++r,x)-c;
pre[i]=q[p-];q[p]=i;c[p]=x;
}
}
int main()
{
freopen("grading.in","r",stdin);
freopen("grading.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
LIS();p=q[r];
while(p){
b[p]=;
q[r--]=p;
p=pre[p];
}
for(int i=;i<=n;i++){
if(b[i]==)continue;
int s1,s2=inf;
for(int k=i-;k>=;k--)
if(b[k]){
s1=a[k];break;
}
for(int k=i+;k<=n;k++)
if(b[k]){
s2=a[k];break;
}
A+=min(Abs(a[i]-s1),Abs(a[i]-s2));
}
memset(c,,sizeof(c));
memset(q,,sizeof(q));
memset(b,,sizeof(b));
memset(pre,,sizeof(pre));
r=p=;
for(int i=;i<=(n+)/;i++)
swap(a[i],a[n-i+]);
LIS();p=q[r];
while(p){
b[p]=;
q[r--]=p;
p=pre[p];
}
for(int i=;i<=n;i++){
if(b[i]==)continue;
int s1,s2=inf;
for(int k=i-;k>=;k--)
if(b[k]){
s1=a[k];break;
}
for(int k=i+;k<=n;k++)
if(b[k]){
s2=a[k];break;
}
B+=min(Abs(a[i]-s1),Abs(a[i]-s2));
}
printf("%d\n",min(A,B));
return ;
}
正解dp
/*
正解 离散化+dp
f[i][j]表示前i个元素构成的不降序列在最后的大小为j的最小消耗
f[i][j]=min(f[i-1][k]+Abs(a[i]-b[j]))
n*n*n Tle
因为f[i][j-1]这个状态已经是找过f[i-1][1....j-1]的最小的了
所以直接用 在考虑一下新的f[i-1][j]
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 2010
using namespace std;
int n,a[maxn],b[maxn],f[maxn][maxn],ans;
int cmp(int x,int y){
return x>y;
}
int Abs(int x){
return x<?-x:x;
}
int main()
{
freopen("grading.in","r",stdin);
freopen("grading.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b++n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(j==)f[i][j]=f[i-][j]+Abs(a[i]-b[j]);
else f[i][j]=min(f[i][j-],f[i-][j]+Abs(a[i]-b[j]));
ans=f[n][n];
sort(b+,b++n,cmp);
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(j==)f[i][j]=f[i-][j]+Abs(a[i]-b[j]);
else f[i][j]=min(f[i][j-],f[i-][j]+Abs(a[i]-b[j]));
ans=min(ans,f[n][n]);
printf("%d\n",ans);
return ;
}
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
正解好像是分块 然而对于我这应付noip的蒟蒻来说并没有打算学~~
暴力100(数据弱~~)
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,m,a[maxn];
char c[];
int main()
{
//freopen("magic.in","r",stdin);
//freopen("magic.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
int x,y,z;
while(m--){
scanf("%s",c);
if(c[]=='M'){
scanf("%d%d%d",&x,&y,&z);
for(int i=x;i<=y;i++)a[i]+=z;
}
if(c[]=='A'){
scanf("%d%d%d",&x,&y,&z);
int cnt=;
for(int i=x;i<=y;i++)
if(a[i]>=z)cnt++;
printf("%d\n",cnt);
}
}
return ;
}
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 ;
正解费用流 原因同上.
9.23 noip模拟试题的更多相关文章
- 10.23 noip模拟试题
尼玛蛋pdf好难粘 直接写了 T1 /*开始写wa了 我真弱2333 关于p的排序规则不只是差值 为了字典序最小 还要拍别的*/ #include<cstdio> #include< ...
- 9.20 noip模拟试题
Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我 ...
- 11.14 noip模拟试题
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer ...
- 11.9 noip模拟试题
NOIP2016 模拟赛——那些年,我们学过的文化课背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, 而 ...
- 10.26 noip模拟试题
enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...
- 10.3 noip模拟试题
希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“ ...
- 【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计
1. 素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷 ...
- 神奇的Noip模拟试题 T3 科技节 位运算
3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...
- 神奇的Noip模拟试题一试 2 排队
2 排队 (lineup.pas/.c/.cpp) [问题描述] 小sin所在的班有n名同学,正准备排成一列纵队,但他们不想按身高从矮到高排,那样太单调,太没个性.他们希望恰好有k对同学是高的在前,矮 ...
随机推荐
- GNOME Shell叫板Ubuntu Unity:优劣PK
转自GNOME Shell叫板Ubuntu Unity:优劣PK GNOME Shell 对阵 Ubuntu Unity--默认桌面界面的战火一触即发.双方在台上已经对峙了很长时间,现在是时候决定谁会 ...
- [LeetCode#128]Word Ladder II
Problem: Given two words (start and end), and a dictionary, find all shortest transformation sequenc ...
- 我要爱死这个markdown 了
今天上班依旧看wpdang的文章,最后作者说,文章使用markdown写的,好奇心促使我搜了一把什么是markdown.然后看到了这篇文章,一瞬间就开始兴奋了.顿时觉得,这个东西太好用 了,简直又激起 ...
- 【转】Xcode 7 真机调试详细步骤
原文网址:http://www.jianshu.com/p/fa5f90b61ad6 文/ldjhust(简书作者)原文链接:http://www.jianshu.com/p/fa5f90b61ad6 ...
- mkimage使用详解
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字 ...
- python中文乱码例子
#coding=utf-8 #---中文乱码--- #直接打印中文 print '千里之外取人首级,瞬息之间爆人菊花.' #中文前面加u,变成Unicode编码 print u'千里之外取人首级' # ...
- C++ string 构造的陷阱
先看代码 #include<iostream> #include<string> using namespace std; int main(int argc, char ** ...
- C++之拷贝构造函数
为什么要引入拷贝构造函数?(提出问题) 作用:创建一个对象的同时,使用一个已经存在的对象给另一个对象赋值 做比较:拷贝构造函数:对象被创建 + 用一个已经存在的对象 进行初始化 拷贝赋值函数:对象已 ...
- poj 2425 A Chess Game(SG函数)
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3551 Accepted: 1440 Desc ...
- hdoj 1969 Pie【二分】
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...