Porble 1时间与空间之旅(tstrip.*)

题目描述

公元22××年,宇宙中最普遍的交通工具是spaceship。spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一。当然,要成为一名出色的船长,必须通过严格的考核,例如下面是最简单的问题中的一个。

用1~n的整数给n个星系标号,目前你在标号为1的星系,你需要送快递到标号为n的星系,星系之间由于存在陨石带,并不是都可以直连的。同时,由于超时空隧道的存在,在某些星系间飞行会出现时间静止甚至倒流,飞行时间为0或为负数。另外,由星系i到星系j的时间和由星系j到星系i的时间不一定是相同的。

在寄出日期之前收到快递被认为是不允许的,所以每部spaceship上都有一个速度调节装置,可以调节飞行的时间。简单来说其功能就是让所有两个星系间的飞行时间(如果可以直达)都增加或减少相同的整数值,你的任务就是调整速度调节器,找出一条用最短时间完成任务的路径,并且保证这个最短时间的值大于或等于0。

输入格式

输入文件包含多组数据,第1个数为T,表示数据的数量。

对于每一组数据,输入第1行为两个正整数N(2≤N≤100),E(1≤E≤N*(N-1)/2),为星系的个数和星系间飞行的路线数。然后E行,每行三个整数i,j和t(1≤i,j≤N,i≠j,-100000≤t≤100000),表示由星系i到星系j飞行的时间为t。由i到j最多只会有一条飞行线路。

输出格式

输出文件共T行,每组数据输出一行;

如果可以通过调节速度调节器完成任务,则输出一个非负整数,表示由星系1到星系N的最短时间。

如果不能由星系1到达星系N,则输出-1。

输入样例

1

4 5

1 2 1

1 3 1

2 3 -3

3 1 1

3 4 1

输出样例

2

样例说明

输入样例如图所示,其中节点标号表示相应星系,节点间数字表示所需时间。

如果设置速度控制器的值为0,则有如下路径:1→2→3→1→2→……→3→4,使得投递的时间为负无穷大,显然是不符合要求的,所以应该把速度控制器的值设为1,相当于每个时间值加1,得到的最短路径为1→2→3→4,所需时间为2+(-2)+2=2。

/*
二分需要改变的值,判断该值是否可行
由于要求最短的方案,所以这个值越小越好,满足单调性,可以二分答案,判断条件就是是否存在负环,用spfa
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
#define maxn 110
int n,m,dis[maxn],num,head[maxn],T,num2,head2[maxn],ans,t[maxn];
bool m1[maxn],m2[maxn],mark[maxn],vis[maxn];
struct node{
int to,pre,v;
}e[maxn*maxn/],e2[maxn*maxn/];
void Insert(int from,int to,int v){
e[++num].to=to;
e[num].v=v;
e[num].pre=head[from];
head[from]=num; e2[++num2].to=from;
e2[num2].v=v;
e2[num2].pre=head2[to];
head2[to]=num2;
}
void dfs1(int now){
m1[now]=;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(!m1[to])dfs1(to);
}
}
void dfs2(int now){
m2[now]=;
for(int i=head2[now];i;i=e2[i].pre){
int to=e2[i].to;
if(!m2[to])dfs2(to);
}
}
bool spfa(int x){
memset(vis,,sizeof(vis));
memset(dis,/,sizeof(dis));
memset(t,,sizeof(t));
stack<int>q;
vis[]=;dis[]=;t[]=;q.push();
while(!q.empty()){
int now=q.top();q.pop();vis[now]=;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(!mark[to])continue;
if(dis[to]>dis[now]+e[i].v+x){
dis[to]=dis[now]+e[i].v+x;
if(!vis[to]){
vis[to]=;
t[to]++;
if(t[to]>n)return ;
q.push(to);
}
}
}
}
if(dis[n]<)return ;
return ;
}
int main(){
freopen("tstrip.in","r",stdin);
freopen("tstrip.out","w",stdout);
//freopen("Cola.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
num=;num2=;
memset(head,,sizeof(head));
memset(e,,sizeof(e));
memset(head2,,sizeof(head2));
memset(e2,,sizeof(e2));
memset(vis,,sizeof(vis));
memset(m1,,sizeof(m1));
memset(m2,,sizeof(m2));
int x,y,z;
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
Insert(x,y,z);
}
dfs1();
if(!m1[n]){
printf("-1\n");
continue;
}
dfs2(n);
for(int i=;i<=n;i++)mark[i]=m1[i]&m2[i];
int l=-,r=;
while(l<=r){
int mid=(l+r)>>;
if(spfa(mid)){
ans=dis[n];
r=mid-;
}
else l=mid+;
}
printf("%d\n",ans);
}
}

100分 spfa判负环+二分答案

Problem 2 狐狸的谜语(puzzle.*)

题目描述

话说某一个月黑风高的晚上,一只褐色的狐狸快速地跳过了一只懒狗,并留下一个字符串“032089”和一个数字5。

这其中一定隐含了某些秘密!酷爱思考的你马上发现,这个字符串可以写成:“03+2+0*89”,结果为5。这是一个非常有趣的问题!

现在给出一个长度为N的数字字符串和一个数字T,要求插入最少的加号或者乘号,使得数字字符串的运算结果为T。运算符*号优先级高于+号,运算数可以有任意个前导0。

榆入格式

输入不超过5组数据,每组数据两行。

每组数据的第1行为长度为N,只包含0~9的数字字符串,第2行为一个数字T。

输入T<0表示输入结束。

输出格式

输出一个数字单独占一行,表示最少需要添加的运算符(+号或*号)数,无解输出-1。

输入样例

032089

5

333

9

00

-1

输出样例

3

2

数据范围

对于30%的数据,有1≤N≤10,0≤T≤50。

对于50%的数据,有1≤N≤15,0≤T≤200。

对于全部的数据,有1≤N≤20,0≤T≤200。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t,num[][],len,w[],op[];
int a[],ans,cnt;
bool flag;
char ch[];
bool check(){
cnt=;
memset(w,,sizeof(w));
int s=,d=;
for(int i=;i<len;i++){
if(a[i]==)d++;
else {
cnt=cnt+;
w[cnt]=num[s][d];
op[cnt]=a[i];
s=d=i+;
}
}
w[++cnt]=num[s][d];
for(int i=;i<cnt;i++){
if(op[i]==){
w[i+]*=w[i];
w[i]=;
}
}
long long sum=;
for(int i=;i<=cnt;i++)sum+=w[i];
if(sum==t)return ;
return ;
}
void dfs(int now,int sum){
if(sum>ans)return;
if(now==len){
if(check())
flag=,ans=min(ans,sum);
return;
}
a[now]=;
dfs(now+,sum+);
a[now]=;
dfs(now+,sum+);
a[now]=;
dfs(now+,sum);
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("puzzle.in","r",stdin);
freopen("puzzle.out","w",stdout);
while(){
flag=;
ans=;
memset(num,,sizeof(num));
memset(a,,sizeof(a));
scanf("%s%d",ch+,&t);
if(t==-)return ;
len=strlen(ch+);
for(int i=;i<=len;i++)num[i][i]=ch[i]-'';
for(int i=;i<=len;i++)
for(int j=i+;j<=len;j++)
num[i][j]=num[i][j-]*+num[j][j];
dfs(,);
if(!flag){
printf("-1\n");
continue;
}
printf("%d\n",ans);
}
}

30分 暴力

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
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;
}
char a[];
int len,t,deep,v[][];
bool flag,b[];
void pre(){
for(int i=len;i;i--)
if(a[i]==''){
while(i--)b[i]=;
break;
}
else b[i]=;
for(int i=;i<=len;i++)
for(int j=i;j<=len;j++){
v[i][j]=v[i][j-]*+a[j]-'';
v[i][j]=min(v[i][j],t+);
}
}
void dfs(int x,int k,int last,int mul,int sum){
if(sum>t||flag||k>deep)return;
if(x==len){
if(sum+mul*v[last+][len]==t)flag=;
return;
}
if(b[x-]&&sum+mul>t)return;
dfs(x+,k+,x,,sum+mul*(v[last+][x]));
dfs(x+,k+,x,mul*(v[last+][x]),sum);
dfs(x+,k,last,mul,sum);
}
void solve(){
pre();
int ans=-;
int l=,r=len-;
while(l<=r){
deep=(l+r)>>;
flag=;
dfs(,,,,);
if(flag)ans=deep,r=deep-;
else l=deep+;
}
printf("%d\n",ans);
}
int main(){
freopen("puzzle.in","r",stdin);
freopen("puzzle.out","w",stdout);
while(scanf("%s%d",a+,&t)){
if(t==-)return ;
len=strlen(a+);
solve();
}
return ;
}

100分 二分+迭代加深搜索

Problem 3花园的守护之神(greendam.*)

题目描述

看着正在被上古神兽们摧残的花园,花园的守护之神――小Bug同学泪流满面。然而,FZOI不相信眼泪,小bug与神兽们的战争将进行到底!

通过google,小Bug得知,神兽们来自遥远的戈壁。为了扭转战局,小Bug决定拖延神兽增援的速度。从戈壁到达花园的路径错综复杂,由若干段双向的小路组成。神兽们通过每段小路都需要一段时间。小Bug可以通过向其中的一些小路投掷小xie来拖延神兽。她可以向任意小路投掷小Xie,而且可以在同一段小路上投掷多只小xie。每只小Xie可以拖延神兽一个单位的时间。即神兽通过整段路程的总时间,等于没有小xie时他们通过同样路径的时间加上路上经过的所有小路上的小xie数目总和。

神兽们是很聪明的。他们会在出发前侦查到每一段小路上的小Xie数目,然后选择总时间最短的路径。小Bug现在很想知道最少需要多少只小Xie,才能使得神兽从戈壁来到花园的时间变长。作为花园中可爱的花朵,你能帮助她吗?

输入格式

第1行包括一个整数N,表示地图中路点的个数;一个整数M,表示小路个数;以及整数S和T,分别表示戈壁和花园的路点编号。N个路点分别被编号为自然数1~N。

以下M行,每行三个整数A、B和C,表示路点A和B之间有一条小路相连,且通过它需要的时间为C。

输入数据保证两路点间最多只有一条小路相连,且戈壁和花园的路点是连通的。

输出格式

一个整数,表示使S到T之间最短路增长所需要的最少的小xie的数目。

输入样例

5 5 1 5

1 2 1

2 3 3

1 4 2

4 3 2

5 1

输出样例

1

数据范围

对于30%的数据,满足N≤10,M≤50。

对于50%的数据,满足N≤200,M≤10000。

对于全部的数据,满足N≤1000,M≤499500,0<C≤1000000。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 1010
using namespace std;
int n,m,num,head[maxn],S,T,dis[maxn],f[maxn],mx,sum,falg;
struct node{
int v,t,pre,x;
}e[maxn*maxn];
queue<int>q;
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(int from,int to,int dis){
e[num].v=to;
e[num].t=dis;
e[num].pre=head[from];
head[from]=num++;
}
int SPFA(){
while(!q.empty())q.pop();
memset(f,,sizeof(f));
memset(dis,/,sizeof(dis));
dis[S]=;f[S]=;
q.push(S);
while(!q.empty()){
int k=q.front();
q.pop();f[k]=;
for(int i=head[k];i!=-;i=e[i].pre){
int v=e[i].v;
if(dis[v]>dis[k]+e[i].t+e[i].x){
dis[v]=dis[k]+e[i].t+e[i].x;
if(f[v]==){
f[v]=;q.push(v);
}
}
}
}
return dis[T];
}
void Dfs(int now,int s){
if(s==sum||now==num){
if(SPFA()>mx)falg=;
return;
}
e[now].x++;e[now^].x++;
Dfs(now+,s+);if(falg)return;
e[now].x--;e[now^].x--;
Dfs(now+,s);if(falg)return;
}
int main()
{
freopen("greendam.in","r",stdin);
freopen("greendam.out","w",stdout);
n=init();m=init();S=init();T=init();
int u,v,t;memset(head,-,sizeof(head));
for(int i=;i<=m;i++){
u=init();v=init();t=init();
Add(u,v,t);Add(v,u,t);
}
mx=SPFA();
for(sum=;sum<=m;sum++){
Dfs(,);
if(falg)break;
}
printf("%d\n",sum);
return ;
}

30分 暴力

2014-10-28 NOIP模拟赛的更多相关文章

  1. 10.17 NOIP模拟赛

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

  2. 10.16 NOIP模拟赛

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

  3. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  4. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  5. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  6. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  7. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  8. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  9. 2016.10.29 NOIP模拟赛 PM 考试整理

    300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...

  10. 2017.10.28 QB模拟赛 —— 下午

    题目链接 T1 按x值排序 遇到第二种牌插入 遇到第一种牌 查询<=y 的最小值 删除他 splay multiset cys大佬说 multiset就是不去重的set, #include &l ...

随机推荐

  1. ABAP-创建信息记录

    CALL FUNCTION 'ME_INITIALIZE_INFORECORD'. CALL FUNCTION 'ME_DIRECT_INPUT_INFORECORD' *&--------- ...

  2. Python实现简易HTTP服务器

    一.Python3 搭建简易HTTP服务器 python -m http.server 浏览器访问:http://localhost:8000 Python3 cgiserver python -m  ...

  3. Java基础教程:JDBC编程

    Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...

  4. Eureka 集群

    集群搭建是在单节点基础上做的 单节点注册中心搭建-->https://www.cnblogs.com/chenglc/p/9561295.html 在单节点的基础上修改配置文件 bootstra ...

  5. koa-bodyparser返回413状态码的问题

    413 Request Entity Too Large(请求实体太大) 数日前,我用 node.js 写的一个日志服务抛出了这个状态码-- 自己写的服务抛出了一个自己都不认识的状态码,这是最气的!( ...

  6. HDU 3853 LOOPS:期望dp【网格型】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意: 有一个n*m的网格. 给出在每个格子时:留在原地.向右走一格,向下走一格的概率. 每走一 ...

  7. 分享知识-快乐自己:Struts2中 获取 Request和Session

    目录结构: POM: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnco ...

  8. HTML font: 12px/1.5 Arial; 是什么意思

    意思是: 字体12像素 行高 1.5em 字体 Arial 可以参考下面资料: 我们常用的font属性有下面这六种: font-style设定斜体 如:font-style: italic; font ...

  9. ES设置字段搜索权重——Query-Time Boosting

    Query-Time Boosting In Prioritizing Clauses, we explained how you could use the boost parameter at s ...

  10. Android sdk 搭建

    下载安装 http://pan.baidu.com/wap/share/home?uk=67915989&third=0 搭建Android环境时,无论使用的Eclipse还是Android ...