好了不要在铺垫了直接整吧就

题目拿来!!!!!!!

倒水
(water)
(256MB,1s)
【问题描述】
你有一个水桶(记为 0),两个杯子(记为 1,2)。水桶中的水量
无限,容量也无限。1 号杯子容量为 a ml,2 号杯子容量为 b ml。一
开始,两个杯子里都没有水。
你可以执行以下几种操作:
1、将 1 号杯子中的水倒入水桶
2、将水桶中的水倒入 2 号杯子
3、将 2 号杯子中的水倒入 1 号杯子
每次倒水直到倒出水的杯子满或倒入水的杯子空才停止。
现在希望 1 号杯子中的水尽量少,但大于 0。
问通过以上操作能够获得 1 号杯子的最少水量 t 为多少?(t>0)
记获得最少水量执行了 pa 次操作 1,pb 次操作 2,希望在最少水量
的条件下 pa 尽量小(在 pa 相同的情况下还希望 pb 尽量小)。

【输入格式】
输入文件名为water.in
一行,两个数正整数 a b
【输出格式】
输出文件名为water.out
一行,三个数 t pa pb
(各变量含义如题所述)
【输入样例】
water.in water.out
5 3 1 1 2

倾倒方案为:
 0->2;
 2->1;
 0->2;
 2->1;
 1->0;
 2->1;
【数据规模与约定】
对于 20%的数据,pa,pb 总和不超过 5
对于 60%的数据,pa<=10^8
对于 100%的数据,0<b<=a<=10^9

说实话当时看完这个题我直接套各种东西= =因为一点思路都没有

但它实际上是个推理题

首先我们要知道每个操作执行时满足的条件

1号杯它不会在没有满时倒出,因为1杯未满说明2杯已空(一定有2->1的情况)若倒了就又重新开始了。

2号杯也只有在空的时候会执行二号操作

而2->1可以看作一步操作,因为水量是一定的,他们不对1号杯最小水量做出影响

把1杯2杯步骤三看作一个整体

杯子容量a+b=x 一开始a,b为空

到了末期一定是a>=0,b=0

体现在代码上:

一号操作:x=x-a

二号:x=x+b

三号:x=x

则求a(min)等于求x(min)

一号操作Pa次,二号操作Pb次,余下的水s=Pb*b-Pa*a

余下a与b的线性组合

x(min)=gcd(a,b)

s=gcd(a,b)

且他们的解还要除一个gcd才是min值的累加

解为-Pa+kb,Pb-ka

最小为 -Pa+kb/gcd(a,b),Pb-ka/gcd(a,b)

(好了我知道你们看不懂= =算了,代码一上估计就好理解多了)

那就代码走起!!!!!!!

 #include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int g[][];//邻接矩阵
int f[][][][];//floyd
int _Min(int x,int y){return x<y?x:y;}
int main()
{
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
memset(g,,sizeof(g));
memset(f,,sizeof(f));
int n,m,T,x,y,k,i,j,l,r,s,t,L;
scanf("%d%d",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&k);
g[x][y]=_Min(g[x][y],k);//保存邻接矩阵中
}
for(l=;l<=n;l++)//f[] 预处理
for(r=l;r<=n;r++)//先枚举 l r
{
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(l==r)//只能途经一个点
f[l][r][i][j]=_Min(g[i][j],g[i][l]+g[l][j]);//比较
else
f[l][r][i][j]=_Min(f[l][r-][i][j],f[l][r-][i][r]+f[l][r-][r][j]);//经不经过r
}
}
scanf("%d",&T);//询问
while(T--)
{
scanf("%d%d%d",&s,&t,&L);
if(g[s][t]<=L){
printf("-1\n");//-1为最小的能取到直接出最小答案
continue;
}
r=;//分界点右边的节点 恰好小于等于限制条件的那个
int ans=<<;
for(l=;l<=n;l++)
{
while(r<=n&&f[l][r][s][t]>L)r++;//对于每一行看看是否需要右移 限制在n之内分界点不出去
if(r>n)break;
ans=_Min(ans,r-l);//更新答案
}
if(ans==<<)ans=-;//没有满足条件,直接出-2
printf("%d\n",ans);
}
return ;
}

o的k?

奥利给!整他就完了!

好了今天就到这里吧 如有不懂 我也不会讲= =

散会!

集训模拟赛-1-T2的更多相关文章

  1. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

  2. 10-18 noip提高组模拟赛(codecomb)T2贪心

    T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...

  3. 6.30集训模拟赛4(炸裂的一天qwq)

    T1浇水: 题目描述 在一条长n米,宽m米米的长方形草地上放置着k个喷水装置.假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m/2),也就 ...

  4. 雅礼 noip2018 模拟赛day3 T2

    典型的状压思想 设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望 那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可 在状 ...

  5. 2018.10.17校内模拟赛:T2神光

    题面:pdf 首先排序,二分,然后怎么判定是否可行. 最简单的思路是,dp[i][j][k],到第i个,用了j次红光,k次绿光,前i个点都选上了,是否可行.然后转移就行. 然后考试的时候就想到这了,往 ...

  6. noip提高组模拟赛(QBXT)T2

    T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ...

  7. Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)

    /* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...

  8. 模拟赛DAY1 T2腐草为萤

    2.腐草为萤(dzy.cpp/c) [题目背景] 纤弱的淤泥中妖冶颓废在季夏第三月最幼嫩的新叶连凋零都不屑何必生离死别——银临<腐草为萤> [问题描述] 扶苏给了你一棵树,这棵树上长满了幼 ...

  9. 「2018-12-02模拟赛」T2 种树 解题报告

    2.种树(tree.pas/cpp/in/out) 问题描述: Fanvree 很聪明,解决难题时他总会把问题简单化. 例如,他就整天喜欢把图转化为树.但是他不会缩环,那他怎么转化呢? 这是一个有 n ...

  10. 清北学堂模拟赛2 T2 ball

    题目大意: 多组数据,每组给定n,m,表示将n个小球放进m个箱子,每个小球均有两个箱子(可能相同)可放,求所有小球均放好的方案mod998244353的总数. 思路: 算是我和题解思路肥肠相近的一道题 ...

随机推荐

  1. Atlas运行时资源不足报错 -bash: fork: retry: 资源暂时不可用 Out of system resources

    目的:运行Atlas并使用Azkaban执行操作任务 环境:Centos 6 内存大小:12G 启动下面的任务后还剩内存将近5G 问题: 当mysql_to_hdfs_db和其他job同时运行时集群很 ...

  2. Golang 性能测试 (3) 跟踪刨析 golang trace

    简介 对于绝大部分服务,跟踪刨析是用不到的.但是如果遇到了下面问题,可以不妨一试: 怀疑哪个协程慢了 系统调用有问题 协程调度问题 (chan 交互.互斥锁.信号量等) 怀疑是 gc (Garbage ...

  3. vue-cli3 按需引入 element-ui 报错

    报错信息: Cannot find module 'babel-preset-es2015' from .... 解决办法: 安装最新的 Babel 编译插件:@babel/preset-env 修改 ...

  4. Linux环境安装Docker

    1. 使用APT安装 # 更新数据源 apt-get update # 安装所需依赖 apt-get -y install apt-transport-https ca-certificates cu ...

  5. cmd批处理转义字符%的详细解释

    cmd批处理转义字符%的详细解释 在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同. 1.%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符.逃逸 ...

  6. 自己实现一个 DFA 串模式识别器

    自己实现一个 DFA 串模式识别器 前言 这是我编译原理课程的实验.希望读完这篇文章的人即便不知道 NFA,DFA 和正规表达式是什么,也能够对它们有一个简单的理解,并能自己去实现一个能够识别特定模式 ...

  7. Floyd-例题-实现-我的第一篇博客

    https://www.cnblogs.com/lbssxz/p/11014911.html 这是网上看到的题目,以上是原博主的解答和题目来源(没找到别的题目来源) 题目大意: 城市交通费 [问题描述 ...

  8. D3js怎么获得SVG及其子元素在屏幕中的坐标

    var clientRects = svg.select("image").node().getBoundingClientRect(); var coordinates = [ ...

  9. Android | 教你如何在安卓上实现二代身份证识别,一键实名认证

    @ 目录 前言 场景 开发前准备 android studio 安装 在项目级gradle里添加华为maven仓 在应用级的build.gradle里面加上SDK依赖 在AndroidManifest ...

  10. jQuer实时监控input对table进行筛选

    记得以前写过一个预定表格~~~~~比这个更难,一大串前端js~~~忘了~~~好记性不如烂笔头~~记录下,既帮助别人,也帮助自己~~~ 实现思路~通过.on监听input标签的内容变化,通过this获取 ...