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,/,sizeof(dis));
q.push(N);
dis[N]=;
vis[N]=;
while(!q.empty()){
int now=q.front();q.pop();
if(now>&&dis[now-]>dis[now]+){
dis[now-]=dis[now]+;
if(now-==N)return;
if(!vis[now-]){
vis[now-]=;
q.push(now-);
}
}
if(now+<=mx&&dis[now+]>dis[now]+){
dis[now+]=dis[now]+;
if(now+==N)return;
if(!vis[now+]){
vis[now+]=;
q.push(now+);
}
}
if(now*<=mx&&dis[now*]>dis[now]+){
dis[now*]=dis[now]+;
if(now*==N)return;
if(!vis[now*]){
vis[now*]=;
q.push(now*);
}
}
}
}
int main(){
freopen("catchcow.in","r",stdin);
freopen("catchcow.out","w",stdout);
scanf("%d%d",&N,&K);
mx=max(N,K)+;
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。
/*
很显然的dp,题目在拼命的让你想最长不下降和最长不上升子序列
可是,这个dp怎么做?
我们很难确定最终结果是上升还是下降,但是数据规模才2000,n方!
两种结果都讨论一下。
将数列存两遍,a[]为原序列,b[]是有序的序列
dp[i][j]是指已讨论到i,并把a[i]变成b[j]的最小代价
则转移方程为dp[i][j]=min(dp[i][j-1],dp[i-1][j]+abs(a[i]-b[j]))
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
#define maxn 2010
int n,a[maxn],b[maxn],dp[maxn][maxn],f[maxn][maxn],ans;
void prepare(){
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)dp[i][]=0x3fffffff;
memset(f,,sizeof(f));
}
int cmp(int x,int y){
return x>y;
}
int main(){
//freopen("Cola.txt","r",stdin);
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+);
prepare();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
f[i][j]=dp[i-][j]+abs(a[i]-b[j]);
dp[i][j]=min(dp[i][j-],f[i][j]);
}
}
ans=dp[n][n];
prepare();
sort(b+,b+n+,cmp);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
f[i][j]=dp[i-][j]+abs(a[i]-b[j]);
dp[i][j]=min(dp[i][j-],f[i][j]);
}
}
ans=min(dp[n][n],ans);
printf("%d",ans);
}
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
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,cnt,a[],b[],pos[],block,ADD[];
void Set(int x){
int l=(x-)*block+,r=min(n,x*block);
for(int i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+r+);
}
void Grow(int x,int y,int z){
if(pos[x]==pos[y])for(int i=x;i<=y;i++)a[i]+=z;
else {
for(int i=x;i<=pos[x]*block;i++)a[i]+=z;
for(int i=(pos[y]-)*block+;i<=y;i++)a[i]+=z;
}
Set(pos[x]);Set(pos[y]);
for(int i=pos[x]+;i<pos[y];i++)ADD[i]+=z;
}
int coco(int x,int v){
int l=(x-)*block+,r=min(n,x*block);int last=r;
while(l<=r){
int mid=(l+r)>>;
if(b[mid]<v)l=mid+;
else r=mid-;
}
return last-l+;
}
int Ask(int x,int y,int z){
int ans=;
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++)if(a[i]+ADD[pos[i]]>=z)ans++;
}
else{
for(int i=x;i<=pos[x]*block;i++)if(a[i]+ADD[pos[i]]>=z)ans++;
for(int i=(pos[y]-)*block+;i<=y;i++)if(a[i]+ADD[pos[i]]>=z)ans++;
}
for(int i=pos[x]+;i<pos[y];i++)ans+=coco(i,z-ADD[i]);
return ans;
}
int qread(){
char c=getchar();int i=,j=;
while(c<''||c>''){if(c=='-')j=-;c=getchar();}
while(c<=''&&c>=''){i=i*+c-'';c=getchar();}
return i*j;
}
int main(){
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
n=qread();m=qread();
block=(int)(sqrt(n));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
pos[i]=(i-)/block+;
b[i]=a[i];
}
if(n%block)cnt=n/block+;
else cnt=n/block;
for(int i=;i<=cnt;i++)Set(i);
char ch[];int x,y,z;
for(int i=;i<=m;i++){
scanf("%s",ch);
x=qread();y=qread();z=qread();
if(ch[]=='M')Grow(x,y,z);
if(ch[]=='A')printf("%d\n",Ask(x,y,z));
}
}
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模拟赛的更多相关文章
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 【2019.7.16 NOIP模拟赛 T2】折叠(fold)(动态规划)
暴力\(DP\) 考虑暴力\(DP\),我们设\(f_{i,j}\)表示当前覆盖长度为\(i\),上一次折叠长度为\(j\)的方案数. 转移时需要再枚举这次的折叠长度\(k\)(\(k\ge j\)) ...
- 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)
找环 考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现. 因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了. 貌似比我比赛时被卡成\(30\)分的倍增简单多了? 代码 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- 【noip模拟赛4】Matrix67的派对 暴力dfs
[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们 ...
- Nescafe #29 NOIP模拟赛
Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
随机推荐
- 开源流媒体云视频平台EasyDarwin中EasyCMS服务是如何进行命令转发和消息路由的
EasyCMS介绍 EasyCMS做为EasyDarwin开源流媒体云平台解决方案的一部分,主要进行的是设备的接入和Session(DeviceSession & ClientSession) ...
- Spring注入service为null另类解决办法 工具类 一般类 静态 非controller
系统为SpringMVC框架,在开发的过程中有一些工具类需要调用下由spring管理的service层.但是一进注入不进来,报null异常: 在尝试了网上的一系列方法后,还是没有解决.网上的解决方法主 ...
- java基础知识查漏 三
一.Servlet 和Jsp的生命周期 1.Servlet生命周期 Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发 ...
- java手写单例模式
1 懒汉模式 public class Singleton { private Singleton singleton = null; private Singleton() { } public S ...
- Delphi的类方法不是静态方法
Delphi中,类方法不是你理解的静态方法 Delphi中的类方法与C++类中的static方法完全没有可比性.Delphi中的类方法是有Self的,而Self就是类本身(注意不是对象),而这个Sel ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan —— DFS找环
题目链接:http://codeforces.com/contest/742/problem/C C. Arpa's loud Owf and Mehrdad's evil plan time lim ...
- html5--3.19 新增的progress/meter元素
html5--3.19 新增的progress/meter元素 学习要点 了解progress/meter元素的用法 progress元素 是HTML5中新增的元素,用来建立一个进度条 通常与Java ...
- Kvm学习文档记录
一.实验环境: 在vmware上打开vt支持选项: 操作系统信息: [root@node2 ~]# cat /etc/issue CentOS release 6.6 (Final) Kernel \ ...
- js操作本地文件
只有IE支持js对本地文件操作 其他浏览器都不支持