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);

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;

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的路线。


T1:

直接模拟即可

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 5000
using namespace std;
int dx,dy;
int gx[]={,,-,};
int gy[]={,-,,};
//E S W N
int x,y;
int T;
char s[MAXN]; int main()
{
scanf("%s",s+);
scanf("%d",&T);
int len=strlen(s+);
for(int i=;i<=len;i++){
if('E'==s[i]){
dx+=gx[];
dy+=gy[];
}
else if('S'==s[i]){
dx+=gx[];
dy+=gy[];
}
else if('W'==s[i]){
dx+=gx[];
dy+=gy[];
}
else{
dx+=gx[];
dy+=gy[];
}
}
int q=T/len;
int p=T%len;
x+=(dx*q),y+=(dy*q);
if(p){
for(int i=;i<=p;i++){
if('E'==s[i]){
x+=gx[];
y+=gy[];
}
else if('S'==s[i]){
x+=gx[];
y+=gy[];
}
else if('W'==s[i]){
x+=gx[];
y+=gy[];
}
else{
x+=gx[];
y+=gy[];
}
}
}
printf("%d %d\n",x,y);
return ;
}

Code1

T2:

用矩阵快速幂优化,得公式

f x        1 0 1                 f 3

(f x-1)=(1 0 0) ^ (x-3) *  (f 2)

f x-2     0 1 0                 f 1

时间复杂度O(T*logn)

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MOD 1000000007
#define ll long long
using namespace std;
struct Mat{
ll s[][];
Mat(){
memset(s,,sizeof(s));
}
friend Mat operator * (const Mat &A,const Mat &B){
Mat ret;
for(int i=;i<;i++){
for(int j=;j<;j++){
for(int k=;k<;k++){
ret.s[i][j]=(ret.s[i][j]+(A.s[i][k]*B.s[k][j])%MOD)%MOD;
}
}
}
return ret;
}
Mat operator = (const Mat &A){
for(int i=;i<;i++){
for(int j=;j<;j++){
s[i][j]=A.s[i][j];
}
}
}
};
int T;
Mat Power(Mat A,int p){
if(==p){
return A;
}
if(p&){
return Power(A*A,p>>)*A;
}
else{
return Power(A*A,p>>);
}
}
int main()
{
// freopen("data.in","r",stdin);
Mat A;
A.s[][]=,A.s[][]=,A.s[][]=;
A.s[][]=,A.s[][]=,A.s[][]=;
A.s[][]=,A.s[][]=,A.s[][]=;
scanf("%d",&T);
for(int i=;i<=T;i++){
int n;
scanf("%d",&n);
if(==n||==n||==n){
printf("1\n");
continue;
}
Mat t=Power(A,n-);
ll ans=(t.s[][]+t.s[][])%MOD;
ans=(ans+t.s[][])%MOD;
printf("%lld\n",ans);
}
return ;
}

Code2

T3:

这题就是个最短路,稍微修改下即可

我第一次用dijk写的,结果T了6个点

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#define MAXN 5005
#define MAXM 30005
#define INF 0x7f7f7f7f
using namespace std;
struct Node{
int s,u;
int d;
Node(int ss,int uu,int dd){
s=ss,u=uu,d=dd;
}
Node(){
s=u=;
d=INF;
}
friend bool operator < (const Node &p1,const Node &p2){
return (p1.d<p2.d);
}
friend bool operator > (const Node &p1,const Node &p2){
return !(p1.d<p2.d);
}
};
priority_queue<Node> q;
int d[][MAXN];
int V,E;
int s[MAXN];
int w[MAXN];
int first[MAXN],Next[MAXM],to[MAXM],W[MAXM],cnt;
int p[][MAXN];
// 0 not change 1 change
int Abs(int x){
return (x>)?x:-x;
}
void Add(int x,int y,int w){
Next[++cnt]=first[x]; first[x]=cnt; to[cnt]=y; W[cnt]=w;
//single edge
}
void dijk(){
d[][]=;
q.push(Node(,,));
while(!q.empty()){
Node t=q.top(); q.pop();
// now using t.s
int ds=(!t.s);
int x=t.u;
if(d[t.s][t.u]!=t.d){
continue;
}
//stay
if(!p[t.s][x]){
if(d[ds][x]>d[t.s][x]){
d[ds][x]=d[t.s][x];
q.push(Node(ds,x,d[ds][x]));
}
}
else{
if(d[ds][x]>d[t.s][x]+s[x]){
d[ds][x]=d[t.s][x]+s[x];
q.push(Node(ds,x,d[ds][x]));
}
}
for(int e=first[x];e;e=Next[e]){
int y=to[e];
int dw=W[e];
if(p[t.s][x]!=p[t.s][y]){
//0 white 1 black
//0->1 w-=delta w=max(w,0)
//1->0 w+=delta
if(!p[t.s][x]){
dw-=Abs(w[x]-w[y]);
dw=max(dw,);
}
else{
dw+=Abs(w[x]-w[y]);
}
}
if(d[ds][y]>d[t.s][x]+dw){
d[ds][y]=d[t.s][x]+dw;
q.push(Node(ds,y,d[ds][y]));
}
}
}
}
int main()
{
// freopen("data.in","r",stdin);
memset(d,0x7f,sizeof(d));
scanf("%d%d",&V,&E);
for(int i=;i<=V;i++){
scanf("%d",&p[][i]);
p[][i]=(!p[][i]);
}
for(int i=;i<=V;i++){
scanf("%d",&w[i]);
}
for(int i=;i<=V;i++){
scanf("%d",&s[i]);
}
for(int i=;i<=E;i++){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
Add(x,y,k);
}
dijk();
int ans=min(d[][V],d[][V]);
printf("%d\n",ans);
return ;
}

Code3

后来改用SPFA,AC了

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#define MAXN 5005
#define MAXM 30005
#define INF 0x7f7f7f7f
using namespace std;
struct Node{
int s,u;
int d;
Node(int ss,int uu,int dd){
s=ss,u=uu,d=dd;
}
Node(){
s=u=;
d=INF;
}
};
int d[][MAXN];
bool b[][MAXN];
queue<Node> q;
int V,E;
int s[MAXN];
int w[MAXN];
int first[MAXN],Next[MAXM],to[MAXM],W[MAXM],cnt;
int p[][MAXN];
// 0 not change 1 change
int Abs(int x){
return (x>)?x:-x;
}
void Add(int x,int y,int w){
Next[++cnt]=first[x]; first[x]=cnt; to[cnt]=y; W[cnt]=w;
//single edge
}
void SPFA(){
d[][]=;
b[][]=;
q.push(Node(,,));
while(!q.empty()){
Node t=q.front(); q.pop();
int S=t.s;
int ds=(!S);
int x=t.u;
b[S][x]=;
// now using t.s
//stay
if(!p[S][x]){
if(d[ds][x]>d[S][x]){
d[ds][x]=d[S][x];
if(!b[ds][x]){
b[ds][x]=;
q.push(Node(ds,x,d[ds][x]));
}
}
}
else{
if(d[ds][x]>d[S][x]+s[x]){
d[ds][x]=d[S][x]+s[x];
if(!b[ds][x]){
b[ds][x]=;
q.push(Node(ds,x,d[ds][x]));
}
}
}
for(int e=first[x];e;e=Next[e]){
int y=to[e];
int dw=W[e];
if(p[S][x]!=p[S][y]){
//0 white 1 black
//0->1 w-=delta w=max(w,0)
//1->0 w+=delta
if(!p[S][x]){
dw-=Abs(w[x]-w[y]);
dw=max(dw,);
}
else{
dw+=Abs(w[x]-w[y]);
}
}
if(d[ds][y]>d[S][x]+dw){
d[ds][y]=d[S][x]+dw;
if(!b[ds][y]){
b[ds][y]=;
q.push(Node(ds,y,d[ds][y]));
}
}
}
}
}
int main()
{
// freopen("data.in","r",stdin);
memset(d,0x7f,sizeof(d));
scanf("%d%d",&V,&E);
for(int i=;i<=V;i++){
scanf("%d",&p[][i]);
p[][i]=(!p[][i]);
}
for(int i=;i<=V;i++){
scanf("%d",&w[i]);
}
for(int i=;i<=V;i++){
scanf("%d",&s[i]);
}
for(int i=;i<=E;i++){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
Add(x,y,k);
}
SPFA();
int ans=min(d[][V],d[][V]);
printf("%d\n",ans);
return ;
}

Code4

可见SPFA效率比dijk高很多啊。。。

NOIP2014-5-10模拟赛的更多相关文章

  1. [luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

    t1-快速多项式变换(FPT) 题解 看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要 ...

  2. ZROI 19.08.10模拟赛

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(20pts:\) 枚举操作序列然后暴力跑,复杂度\(O(6^n)\). \([50,80]pts:\) 枚举改成dfs,每层操 ...

  3. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  4. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  5. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. NOIP模拟赛-2018.10.22

    模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...

  8. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  9. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  10. 10.17(山东多校联合模拟赛 day1)

    山东多校联合模拟赛 day1 题不难 rect [问题描述] 给出圆周上的 N 个点, 请你计算出以这些点中的任意四个为四个角,能构成多少个矩形. 点的坐标是这样描述的, 给定一个数组 v[1..N] ...

随机推荐

  1. c++第0次作业

    1.你认为大学的学习生活.同学关系.师生应该是怎样? 随着大学生活的慢慢到来,我开始领悟到大学并不是自由的天堂,相反,我们更加的走进社会这个牢笼.在这个牢笼中有着从前的我们并不需要在意和考虑的规则与问 ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)11.16

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...

  3. 【Swift】Runtime动态性分析

    Swift是苹果2014年发布的编程开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.Swift已经开源,目前最新版本为2.2.我们知道Objec ...

  4. Beta冲刺Day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  5. linux系统命令学习系列-用户组管理

    先复习一下上节内容: 设置密码命令passwd 用户信息修改命令usermod 用户删除命令userdel 作业:修改user1的用户id为505,家目录到admin,用户组为admin,最后删除us ...

  6. day-3 python多线程编程知识点汇总

    python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...

  7. dede使用心得

    Question one: 最近做了一些视频教程传到优酷网站上,但我想引入这些视频教程到我的网站,在发表时我发现织梦CMS自带的编辑器又不直接支持优酷等视频网站的引用.所以为了方便教程的发布,特意在网 ...

  8. 常用的汇编指令 movs stos

    movsb   把寄存机esi所存的地址的数据以字节复制到edi movsw  把寄存机esi所存的地址的数据以word复制到edi movsd   把寄存机esi所存的地址的数据以dword复制到e ...

  9. Angular 学习笔记 ( PWA + App Shell )

    PWA (Progressive Web Apps) 是未来网页设计的方向. 渐进式网站. Angular v5 开始支持 pwa 网站 (所谓支持意思是说有一些 build in 的方法和规范去实现 ...

  10. maven入门(1-3)构建简单的maven项目

    1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:generate -DgroupId=com.mycompany.app -Dartifac ...