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. 在django模板中添加jquery

    路径 /project_name /app_name /templates /index.html /project_name setting.py /static /js jquery.js 导入方 ...

  2. raid5 阵列硬盘离线数据恢复成功案例

    数据恢复故障描述: 某研究院 DELL 磁盘阵列崩溃,内置15块1TB硬盘搭建的RAID5阵列.一开始有一块硬盘离线,在更换新硬盘进行同步的过程中,第二块磁盘指示灯报警,同步失败,阵列无法正常工作. ...

  3. Android类加载机制及热修复实现

    Android类加载机制 Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中.而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进 ...

  4. IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费

    大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...

  5. Python模块configparser(操作配置文件ini)

    configparser模块提供对ini文件的增删改查方法. ini文件的数据格式: [name1] attribute1=value1 attribute2=value2 [name2] attri ...

  6. Docker学习笔记 - Docker容器与外部网络的连接

    学习目的: ip_forward 包过滤防护墙 iptables 允许端口映射访问 限制ip访问容器 1.ip_forward 控制系统是否会转发流量 检查linux系统转发是否开启命令:sysctl ...

  7. gradle入门(1-6)将Java项目从maven迁移到gradle

    gradle项目与maven项目相互转化(转) 转自: http://www.cnblogs.com/yjmyzz/p/gradle-to-maven.html 一.maven项目->gradl ...

  8. 【原创】自己动手实现RPC服务调用框架

    自己动手实现rpc服务调用框架 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者).battercake- ...

  9. python 类和对象

    类和对象 类 1.类的组成    数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用  属性引用:类名.属性(增删改查)   实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...

  10. c语言一个显示星号的函数(隐藏密码)

    显示星号 void star(char p[])    //显示星号 {     int j; while((p[j] = getch())!='\r') { if(p[j] !='\b') { pr ...