2017-8-20 NOIP模拟赛

by coolyangzc

共3道题目,时间3.5小时

题目名

机器人

数列

虫洞

源文件

robot.cpp/c/pas

seq.cpp/c/pas

holes.cpp/c/pas

输入文件

robot.in

seq.in

holes.in

输出文件

robot.out

seq.out

holes.out

时间限制

1000MS

1000MS

1000MS

内存限制

256MB

256MB

256MB

测试点

20

10

10

测试点分值

5

10

10

评测环境

操作系统:Windows XP SP3

CPU: Pentium(R) Dual-Core CPU E5300 @ 2.60Ghz(2CPUs)

系统内存:2GB

Problem 1 机器人(robot.cpp/c/pas)

【题目描述】

早苗入手了最新的Gundam模型。最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧。

早苗的新模型可以按照输入的命令进行移动,命令包括‘E’、‘S’、‘W’、‘N’四种,分别对应东南西北。执行某个命令时,它会向对应方向移动一个单位。作为新型机器人,它可以执行命令串。对于输入的命令串,每一秒它会按命令行动一次。执行完命令串的最后一个命令后,会自动从头开始循环。在0时刻时机器人位于(0,0)。求T秒后机器人所在位置坐标。

【输入格式】

第1行:一个字符串,表示早苗输入的命令串,保证至少有1个命令

第2行:一个正整数T

【输出格式】

2个整数,表示T秒时,机器人的坐标。

【样例输入】

NSWWNSNEEWN

12

【样例输出】

-1 3

【数据范围】

对于60%的数据 T<=500,000 且命令串长度<=5,000

对于100%的数据 T<=2,000,000,000 且命令串长度<=5,000

【注意】

向东移动,坐标改变改变为(X+1,Y);

向南移动,坐标改变改变为(X,Y-1);

向西移动,坐标改变改变为(X-1,Y);

向北移动,坐标改变改变为(X,Y+1);

/*
大模拟
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 5001 using namespace std;
char s[N],c[N];
int n,m,ans,cnt1,cnt2,cnt3,cnt4,sx,sy;
long long t,x,y,len; int main()
{
freopen("robot.in","r",stdin);
freopen("robot.out","w",stdout);
scanf("%s",s);len=strlen(s);
cin>>t;
x=t/len;y=t-x*len;
for(int i=;i<len;i++)
{
if(s[i]=='E') ++cnt1;
if(s[i]=='W') ++cnt2;
if(s[i]=='N') ++cnt3;
if(s[i]=='S') ++cnt4;
}
int s1,s2,s3,s4;
s1=cnt1>cnt2?(cnt1-cnt2):;
s2=cnt2>cnt1?(cnt2-cnt1):;
s3=cnt3>cnt4?(cnt3-cnt4):;
s4=cnt4>cnt3?(cnt4-cnt3):;
s1*=x,s2*=x,s3*=x,s4*=x;
sx+=s1-s2;sy+=s3-s4;
for(int i=;i<y;i++)
{
if(s[i]=='E') ++sx;
if(s[i]=='W') --sx;
if(s[i]=='S') --sy;
if(s[i]=='N') ++sy;
}
printf("%d %d\n",sx,sy);
fclose(stdin);fclose(stdout);
return ;
}

Problem 2 数列(seq.cpp/c/pas)

【题目描述】

a[1]=a[2]=a[3]=1

a[x]=a[x-3]+a[x-1]  (x>3)

求a数列的第n项对1000000007(10^9+7)取余的值。

【输入格式】

第一行一个整数T,表示询问个数。

以下T行,每行一个正整数n。

【输出格式】

每行输出一个非负整数表示答案。

【样例输入】

3

6

8

10

【样例输出】

4

9

19

【数据范围】

对于30%的数据 n<=100;

对于60%的数据 n<=2*10^7;

对于100%的数据 T<=100,n<=2*10^9;

/*
矩乘模板
0 0 0 1
0 0 1 0
a[i-1]=0*a[i]+1*a[i-1]+0*a[i-2]+)*a[i-3]
a[i]=1*a[i-1]+0*a[i-2]*1*a[i-3]+0*a[i-4]
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm> using namespace std;
const long long P=;
long long a[][],sum[][],k;
int T,flag; void mul(long long x[][],long long y[][])//矩阵乘法,搬得快速幂的标程
{
long long c[][]={};
int i,j,k;
for(i=;i<=;i++)
for(j=;j<=;j++)
for(k=;k<=;k++)c[i][j]=(c[i][j]+x[i][k]*y[k][j])%P;
for(i=;i<=;i++)
for(j=;j<=;j++)x[i][j]=c[i][j];
} int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d",&k);
if(k<=)//特判
{
printf("1\n");
continue;
}
k-=;//注意乘方的次数要-3
memset(a,,sizeof(a));//注意每次重置转移矩阵
a[][]=a[][]=a[][]=a[][]=a[][]=;
flag=false;
while(k)//快速幂
{
if(k%)
{
if(!flag)
{
for(i=;i<=;i++)
for(j=;j<=;j++)sum[i][j]=a[i][j];
flag++;
}
else mul(sum,a);
}
k>>=;
if(k)mul(a,a);
}
long long s=((sum[][]+sum[][])%P+sum[][])%P;//由手推得
cout<<s<<endl;
}
return ;
}

Problem 3 虫洞(holes.cpp/c/pas)

【题目描述】

N个虫洞,M条单向跃迁路径。从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间。虫洞有白洞和黑洞之分。设一条跃迁路径两端的虫洞质量差为delta。

1.从白洞跃迁到黑洞,消耗的燃料值减少delta,若该条路径消耗的燃料值变为负数的话,取为0。

2.从黑洞跃迁到白洞,消耗的燃料值增加delta。

3.路径两端均为黑洞或白洞,消耗的燃料值不变化。

作为压轴题,自然不会是如此简单的最短路问题,所以每过1单位时间黑洞变为白洞,白洞变为黑洞。在飞行过程中,可以选择在一个虫洞停留1个单位时间,如果当前为白洞,则不消耗燃料,否则消耗s[i]的燃料。现在请你求出从虫洞1到N最少的燃料消耗,保证一定存在1到N的路线。

【输入格式】

第1行:2个正整数N,M

第2行:N个整数,第i个为0表示虫洞i开始时为白洞,1表示黑洞。

第3行:N个整数,第i个数表示虫洞i的质量w[i]。

第4行:N个整数,第i个数表示在虫洞i停留消耗的燃料s[i]。

第5..M+4行:每行3个整数,u,v,k,表示在没有影响的情况下,从虫洞u到虫洞v需要消耗燃料k。

【输出格式】

一个整数,表示最少的燃料消耗。

【样例输入】

4 5

1 0 1 0

10 10 100 10

5 20 15 10

1 2 30

2 3 40

1 3 20

1 4 200

3 4 200

【样例输出】

130

【数据范围】

对于30%的数据: 1<=N<=100,1<=M<=500

对于60%的数据: 1<=N<=1000,1<=M<=5000

对于100%的数据: 1<=N<=5000,1<=M<=30000

其中20%的数据为1<=N<=3000的链

1<=u,v<=N, 1<=k,w[i],s[i]<=200

【样例说明】

按照1->3->4的路线。

/*
好题。
首先必须进行题目说明,如果当前在白洞,要走白洞->黑洞这条路,那么走过去后黑洞就摆成了白洞,但花费还是白洞到黑洞的花费。
最短路模型 因为可以不走,所以考虑拆点,把一个点拆成黑白两点,不动的情况就可以搞。
当前为白到黑,就连白到白(走过去改变),权值为白到黑的权值。
后面同理。
*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib> #define N 10007
#define M 300007 using namespace std;
int head[M],q[M],col[N],head2[M],si[N],w[N];
int cnt1,n,m,ans,cnt;
bool inq[N];long long d[N];
struct edge
{
int u,v,next,dis;
}e[M];
struct node
{
int u,v,next,dis;
}ed[M]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void add(int u,int v,int dis)
{
e[++cnt].v=v;e[cnt].dis=dis;e[cnt].next=head[u];head[u]=cnt;
} inline void add2(int u,int v,int dis)
{
ed[++cnt1].v=v;ed[cnt1].dis=dis;ed[cnt1].next=head2[u];head2[u]=cnt1;
} void dfs(int x)
{
add(x,x+n,si[x]);//起点连边
add(x+n,x,);
for(int i=head2[x];i;i=ed[i].next)
{
int v=ed[i].v;
int del=abs(w[x]-w[v]);
if(col[x]!=col[v])
{
add(x,v,ed[i].dis+del);
add(x+n,v+n,max(,ed[i].dis-del));
}
else
{
add(x,v+n,ed[i].dis);
add(x+n,v,ed[i].dis);
}
}
} void spfa()
{
memset(d,,sizeof d);
int he=,ta=;
if(col[]){q[]=;d[]=;inq[]=;}
else {q[]=n+;d[n+]=;inq[n+]=;}
while(he!=ta)
{
int now=q[he];he++;if(he==) he=;
for(int i=head[now];i;i=e[i].next)
{
int v=e[i].v;
if(d[v]>d[now]+e[i].dis)
{
d[v]=d[now]+e[i].dis;
if(!inq[v])
{
inq[v]=,q[ta++]=v;
if(ta==) ta=;
}
}
}inq[now]=;
}printf("%I64d",min(d[n],d[n+n]));
} int main()
{
freopen("holes.in","r",stdin);
freopen("holes.out","w",stdout);
int x,y,z;
n=read();m=read();
for(int i=;i<=n;i++) col[i]=read();
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n;i++) si[i]=read();
for(int i=;i<=m;i++)
{
x=read();y=read();z=read();
add2(x,y,z);
}
for(int i=;i<=n;i++) dfs(i);
spfa();
fclose(stdin);fclose(stdout);
return ;
}
/*得分:100+60+0...=160
生无可恋。
不想说什么了,矩阵乘法不熟,T2只敢打暴力。T3读完后认定了题目描述有误,然后就坚定地没有写......搞了半天是题目没读懂。这是能力问题......做题少啊!如果读懂了我也是做不出来的...因为我想到dp上去了......呜呜呜......
今天高一的孩孩儿们来学校了。
加油 加油!*/

conclusion

8.20noip模拟题的更多相关文章

  1. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

  2. poj 1888 Crossword Answers 模拟题

    Crossword Answers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 869   Accepted: 405 D ...

  3. CodeForces - 427B (模拟题)

    Prison Transfer Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Sub ...

  4. sdut 2162:The Android University ACM Team Selection Contest(第二届山东省省赛原题,模拟题)

    The Android University ACM Team Selection Contest Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里 ...

  5. 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中

    题目名称 正确答案  序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...

  6. UVALive 4222 Dance 模拟题

    Dance 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pag ...

  7. cdoj 25 点球大战(penalty) 模拟题

    点球大战(penalty) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/2 ...

  8. Educational Codeforces Round 2 A. Extract Numbers 模拟题

    A. Extract Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...

  9. URAL 2046 A - The First Day at School 模拟题

    A - The First Day at SchoolTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...

随机推荐

  1. Python星号表达式

    有时候可能想分解出某些值然后丢弃它们,可以使用诸如 _ 或者 ign(ignored)等常用来表示待丢弃值的变量名: record = ('ACME', 50, 123.45, (12, 18, 20 ...

  2. tidyverse生态链

    一套完整的数据分析流程 , 如下图所示 从图中可以看到,整个流程包括读取数据,整洁数据,数据探索和交流部分.经过前两部分, 我们可以得到一个整理好的数据,它的每一行都是一个样本 , 每一列是一个变量. ...

  3. python合并多个txt文件成为一个文件

    #coding=utf-8 import os import os.path #文件夹遍历函数 #获取目标文件夹的路径 filedir = './data/click_data' #获取当前文件夹中的 ...

  4. LDAP个人理解

    在新的公司办公,所有的后台系统或文档系统都公用一个LDAP账号. 接触到这个新名词,就查了一下,谈谈个人理解: LDAP是个协议, 简单地说,可以把LDAP服务理解为一套存放你账户密码的数据库系统.市 ...

  5. Oracle ASM注意事项

    ASM是负载均衡的存储策略,加新磁盘会将其它盘数据平均迁移到新磁盘,删除磁盘会将删除磁盘数据平均写回其它磁盘 1.同一磁盘组如果是在raid上,划分的磁盘越少越好,磁盘组分布在不同raid上性能好: ...

  6. Python学习【第5篇】:Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器、模块)

    一.为什么要使用函数? 1.避免代码重用 2.提高代码的可读性 二.函数的定义与调用 1. def  函数名(参数1,参数2): ''' 函数注释''' print('函数体') return 返回值 ...

  7. 七牛直播云-m3u8格式直播

    直播架构 业务服务器:负责协调直播类应用的业务逻辑 创建直播房间 返回直播房间播放地址列表 关闭直播房间 LiveNet 实时流网络:负责流媒体的分发.直播流的创建.查询等相关操作 采集端:负责采集和 ...

  8. redis环境部署

    运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 一.Redis服务介绍: redis简单来讲就是一个数据库,一个用来存储缓存的数据库容器,主要是让项目数据能写进缓存,为用户提搞更舒 ...

  9. PAT 1093. Count PAT's

    The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...

  10. 【IntelliJ IDEA】idea上安装Translation插件后,需要AppKey才能生效的解决方案

    使用idea安装的翻译插件translation,但是使用的时候并不友好 无奈,如果想使用翻译软件并且更方便的话,可以如下: 可以选择将translation进行卸载 清除缓存并进行重启 然后再启动之 ...