NOIP2014-6-14模拟赛
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倍
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
using namespace std;
int b[MAXN];
int n,k;
int qL[*MAXN],qM[*MAXN],L=,R;
void bfs(){
qL[++R]=n;
qM[R]=;
while(L<=R){
int x=qL[L],p=qM[L];
if(x==k){
return;
}
L++;
int dx=x+;
if(<=dx&&dx<MAXN&&!b[dx]){
b[dx]=p+;
qL[++R]=dx;
qM[R]=b[dx];
}
dx=x-;
if(<=dx&&dx<MAXN&&!b[dx]){
b[dx]=p+;
qL[++R]=dx;
qM[R]=b[dx];
}
dx=x*;
if(<=dx&&dx<MAXN&&!b[dx]){
b[dx]=p+;
qL[++R]=dx;
qM[R]=b[dx];
}
}
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&k);
bfs();
printf("%d\n",b[k]);
return ;
}
Code1
T2:
离散化+dp
将高度离散化,f[i][j]表示前i个路段解决,且最后一个路段高度为s[j]的状态(s[j]表示从小到大排序后第j个)
则有f[1][j]=Abs(s[j]-a[1])
f[i][j]=min{f[i-1][k] | 1<=k<=j } + Abs(s[j]-a[i])
把min记录下来边dp边更新O(1)
上面的方程是递增的,递减类似
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 2005
#define ll long long
using namespace std;
int a[MAXN];
int s[MAXN];
ll f[MAXN][MAXN];
int n;
int Abs(int x){
return (x>)?x:-x;
}
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main()
{
n=read();
for(int i=;i<=n;i++){
s[i]=a[i]=read();
}
sort(s+,s+n+);
for(int i=;i<=n;i++){
f[][i]=Abs(s[i]-a[]);
}
for(int i=;i<=n;i++){
ll t=f[i-][];
for(int j=;j<=n;j++){
t=min(t,f[i-][j]);
f[i][j]=t+Abs(s[j]-a[i]);
}
}
ll ans=f[n][];
for(int i=;i<=n;i++){
ans=min(ans,f[n][i]);
}
// printf("%lld\n",ans);
for(int i=;i<=n;i++){
ll t=f[i-][n];
for(int j=n;j>=;j--){
t=min(t,f[i-][j]);
f[i][j]=t+Abs(s[j]-a[i]);
}
}
for(int i=;i<=n;i++){
ans=min(ans,f[n][i]);
}
printf("%lld\n",ans);
return ;
}
Code2
T3:
平方分割
顺便写下注意事项:
1,桶中保存两个数组,一个是原数组,一个是排序后的数组,不可搞混了
2,对于第i个元素,相应的桶编号为i/L,相应桶中的编号为i%L,前提都是从0开始计算
3,对于处理,先讨论是不是在一个桶中,如果是一个桶直接L到R即可。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define SIZE 1005
#define MAXN 1000005
#define ll long long
using namespace std;
struct Bucket{
int len;
ll a[SIZE];
ll b[SIZE];
ll tag;
Bucket(){
len=-;
tag=;
memset(a,,sizeof(a));
memset(b,,sizeof(b));
}
void insert(ll x){
a[++len]=x;
}
void update(){
memcpy(b,a,sizeof(b));
sort(b,b+len+);
}
void Left_Add(int L,ll x){
for(int i=L;i<=len;i++){
a[i]+=x;
}
update();
}
void Right_Add(int R,ll x){
for(int i=;i<=R;i++){
a[i]+=x;
}
update();
}
void Add(int L,int R,ll x){
for(int i=L;i<=R;i++){
a[i]+=x;
}
update();
}
void All_Add(ll x){
tag+=x;
}
int Left_Ask(int L,ll x){
x-=tag;
int ret=;
for(int i=L;i<=len;i++){
if(a[i]>=x){
ret++;
}
}
return ret;
}
int Right_Ask(int R,ll x){
x-=tag;
int ret=;
for(int i=;i<=R;i++){
if(a[i]>=x){
ret++;
}
}
return ret;
}
int All_Ask(ll x){
x-=tag;
int Pos=lower_bound(b,b+len+,x)-b;
return len-Pos+;
}
int Ask(int L,int R,ll x){
tag-=x;
int ret=;
for(int i=L;i<=R;i++){
if(a[i]>=x){
ret++;
}
}
return ret;
}
}S[SIZE];
ll read(){
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,L;
int pos[MAXN];
int main()
{
// freopen("magic.in","r",stdin);
// freopen("magic.out","w",stdout);
int T;
scanf("%d%d",&n,&T);
L=sqrt(n);
for(int i=;i<n;i++){
ll t;
scanf("%lld",&t);
S[i/L].insert(t);
pos[i]=i%L;
}
for(int i=;i<=(n-)/L;i++){
S[i].update();
}
for(int i=;i<=T;i++){
char ch[];
int s,t;ll x;
scanf("%s%d%d%lld",ch,&s,&t,&x);
s--;t--;
int sx=s/L,tx=t/L;
if(sx!=tx){
if('M'==ch[]){
S[sx].Left_Add(pos[s],x);
S[tx].Right_Add(pos[t],x);
for(int j=sx+;j<tx;j++){
S[j].All_Add(x);
}
}
else{
int ans=;
ans+=S[sx].Left_Ask(pos[s],x);
ans+=S[tx].Right_Ask(pos[t],x);
for(int j=sx+;j<tx;j++){
ans+=S[j].All_Ask(x);
}
printf("%d\n",ans);
}
}
else{
if('M'==ch[]){
S[sx].Add(pos[s],pos[t],x);
}
else{
int ans=;
ans+=S[sx].Ask(pos[s],pos[t],x);
printf("%d\n",ans);
}
}
}
return ;
}
Code3
T4:
先玩个dp骗骗分 40分
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<iostream>
#define MAXN 205
#define pii pair<int,int>
using namespace std;
int n;
int X[MAXN],Y[MAXN];
int S[MAXN][MAXN];
int mx,my;
int dp[MAXN+MAXN][MAXN][MAXN];
int go[]={,-};
pii a[MAXN];
void LiSan(){ for(int i=;i<=n;i++){
a[i]=make_pair(X[i],i);
}
sort(a+,a+n+);
for(int i=;i<=n;i++){
if(a[i-].first!=a[i].first) mx++;
X[a[i].second]=mx;
}
for(int i=;i<=n;i++){
a[i]=make_pair(Y[i],i);
}
sort(a+,a+n+);
for(int i=;i<=n;i++){
if(a[i-].first!=a[i].first) my++;
Y[a[i].second]=my;
}
// for(int i=1;i<=n;i++){
// printf("%d %d\n",X[i],Y[i]);
// }
for(int i=;i<=n;i++){
S[X[i]][Y[i]]=;
}
}
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main()
{
// double begin,end;
// begin=clock();
// freopen("pacman1.in","r",stdin);
// freopen("data.out","w",stdout);
n=read();
for(int i=;i<=n;i++){
X[i]=read();
Y[i]=read();
}
LiSan();
// for(int i=1;i<=mx;i++){
// for(int j=1;j<=my;j++){
// printf("%d ",S[i][j]);
// }
// printf("\n");
// }
dp[][][]=S[][]+S[][]+S[][];
for(int s=;s<=mx+my-;s++){
for(int i=;i<=min(mx,s-);i++){
for(int j=i+;j<=min(mx,s-);j++){
for(int k=;k<;k++){
int x1=i+go[k];
int y1=s--x1;
for(int l=;l<;l++){
int x2=j+go[l];
int y2=s--x2;
if(x1==x2&&y1==y2){
continue;
}
dp[s][i][j]=max(dp[s][i][j],dp[s-][x1][x2]);
}
}
dp[s][i][j]+=S[i][s-i];
dp[s][i][j]+=S[j][s-j];
}
}
}
printf("%d\n",dp[mx+my-][mx-][mx]+S[mx][my]);
// end=clock();
// printf("%f\n",(end-begin)/CLOCK_PER_SEC);
return ;
}
Code3
正解是费用流NOIP不考不管啦QAQ
NOIP2014-6-14模拟赛的更多相关文章
- 东方14模拟赛之noip2015/day1/3/神奇的幻方
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 128000kB 描述 幻方是一种很神奇的N*N 矩阵:它由数字 1,2,3, … …,N*N 构成,且每行.每列及 ...
- 2014.6.14模拟赛【bzoj1592】[Usaco2008 Feb]Making the Grade 路面修整
Description FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了 ...
- 2014.6.14模拟赛【bzoj1646】[Usaco2007 Open]Catch That Cow 抓住那只牛
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- noip 2018.10.14 模拟赛 砍树
数学问题... 根据题意,有: 移项,整理,得: 记 于是 那么 可以看到,最多只会有2*个取值(显而易见) 于是对应的,可能产生效果的d也只会有个,于是我们把他们找出来,扔进一个数组里然后排序,去重 ...
- 6.14 YZBOI模拟赛solution
\(6.14\ YZBOI\)模拟赛\(solution\) 本来不想写题解来着...毕竟是自己找的题还是写一写吧 上午为了整活,就把赛制改成\(IOI\)赛制了,于是乎拯救了大家的\(70pts\) ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- PKUSC 模拟赛 day1 下午总结
下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...
- [GRYZ]寒假模拟赛
写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...
- NOIP2018 模拟赛(二十二)雅礼NOI
Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...
- 7.29NOIP模拟赛
7.29NOIP模拟赛 T1 YSG (1s,64MB,ysg.in,ysg.out) 描述 ysg,yxy,azw 三人正在刷题. 他们每做一题的时间都是一个有理数. 如果在某一时刻,三人同时做完一 ...
随机推荐
- nyoj Dinner
Dinner 时间限制:100 ms | 内存限制:65535 KB 难度:1 描述 Little A is one member of ACM team. He had just won t ...
- css的内容
块级元素和行内元素的区别: 1. 行内元素部不能够设置宽度和高度.行内元素的宽度和高度是标签内容的宽度和高度.块级元素可以设置宽度和高度. 2. 块级元素会独占一行.而行内元素却部能够独占一行,只能和 ...
- $.ajax 提交数据到后台.
//AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML -- (Extensible Markup Language 可扩展标记语言 ...
- 策略模式(Stratety)
namespace StrategyPattern //策略模式 { /// <summary> /// 定义所以支持的算法的公共接口 /// </summary> abstr ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- 延迟确认和Nagle算法
前篇文章介绍了三次握手和四次挥手,了解了TCP是如何建立和断开连接的,文末还提到了抓包挥手时的一个“异常”现象,当时无法解释,特地查了资料,知道了数据传输中的延迟确认策略. 何谓延迟确认策略? WIK ...
- Python内置函数(20)——hex
英文文档: hex(x) Convert an integer number to a lowercase hexadecimal string prefixed with "0x" ...
- Mock API是如何在开发中发光发热的?
在长期的服务过程中,我们经常会遇到前来咨询的用户与我们反馈以下这种情况:咨询者是一个前端人员,在项目开发的过程中需要与后端进行对接,遇到后端还没完成数据输出的情况下,他只好写静态模拟数据,在遇到大型项 ...
- SpringCloud是什么?
参考链接: http://blog.csdn.net/forezp/article/details/70148833 一.概念定义 Spring Cloud是一个微服务框架,相比Dubbo ...
- less初学手记
less语言学习手记 工具下载 在less学习中,我们都会需要随时编译我们的less文件,查看生成的css样式表是否正确,以及是否符合我们的要求.推荐一款编译软件供大家下载使用:koala,本软件支持 ...