题目链接:uva 718 - Skyscraper
Floors
题目大意:一栋大楼,有F层楼,E个电梯,现在要从A层到B层,问是否可行,每个电梯给出Xi和Yi,代表这个电梯可以到达的层数Yi+k∗Xi(k≥0)
解题思路:建图,以A,B以及电梯为节点建图,将可以到达A,B这两层的电梯与这两点建边,在将两两电梯可以达到同一层的建边,判断方法为:Yi+aXi=Yj+bXj,移项得:aXi+bXj=Yj−Yi,即是一个线性方程,用拓展欧几里得算法求出通解的形式,判断是否存在通解在0~F之间即可。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 105;
const int INF = 0x3f3f3f3f;
int F, E, A, B, X[maxn], Y[maxn];
vector<int> g[maxn];
void gcd (int a, int b, int& d, int& x, int& y) {
if (b == 0) {
d = a;
x = 1;
y = 0;
} else {
gcd(b, a%b, d, y, x);
y -= (a/b)*x;
}
}
void addPoint (int k, int u, int v) {
if (k < Y[v])
return ;
if ((k-Y[v]) % X[v] == 0) {
g[v].push_back(u);
g[u].push_back(v);
}
}
void addEdge (int u, int v) {
int a = X[u], b = -X[v], c = Y[v] - Y[u];
int d, xi, yi;
gcd(a, b, d, xi, yi);
if (c % d)
return ;
int lower = -INF, up = INF;
double T = (F - Y[u]) * 1.0 / X[u];
if (b / d > 0) {
up = min (up, (int)floor((T*d - xi*c) / b));
lower = max(lower, (int)ceil(-xi*c*1.0/b));
} else {
up = min(up, (int)floor(-xi*c*1.0/b));
lower = max(lower, (int)ceil((T*d - xi*c) / b));
}
T = (F - Y[v]) * 1.0 / X[v];
if (a / d > 0) {
up = min(up, (int)floor((yi*c*1.0)/a));
lower = max(lower, (int)ceil((T*d*-yi*c) / a));
} else {
up = min(up, (int)floor((T*d*-yi*c) / a));
lower = max(lower, (int)ceil((yi*c*1.0)/a));
}
if (up < lower)
return;
g[u].push_back(v);
g[v].push_back(u);
}
void init () {
scanf("%d%d%d%d", &F, &E, &A, &B);
for (int i = 0; i <= E+1; i++)
g[i].clear();
for (int i = 1; i <= E; i++) {
scanf("%d%d", &X[i], &Y[i]);
addPoint(A, 0, i);
addPoint(B, E+1, i);
}
for (int i = 1; i <= E; i++) {
for (int j = 1; j <= E; j++)
addEdge(i, j);
}
}
bool bfs (int s, int e) {
int vis[maxn];
memset(vis, 0, sizeof(vis));
queue<int> que;
que.push(s);
vis[s] = 1;
while (!que.empty()) {
int u = que.front();
que.pop();
if (u == e)
return true;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (vis[v])
continue;
que.push(v);
vis[v] = 1;
}
}
return false;
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init ();
if (bfs(0, E+1))
printf("It is possible to move the furniture.\n");
else
printf("The furniture cannot be moved.\n");
}
return 0;
}
分享到:
相关推荐
Rush01-Skyscraper:来自42岁的鱼的Rush01
曼哈顿摩天大楼浏览器 这是在苏黎世Esri研发中心开发的非商业演示应用程序,用于曼哈顿的建筑探索。 它基于构建,并允许用户以3D方式探索曼哈顿一些最高的建筑物。 产品特点 数据驱动的曼哈顿建筑物可视化 ...
Skyscraper_Fix_HTF_Signal 指标显示了趋势的方向,或者根据选中的柱上 Skyscraper_Fix 指标进行交易的信号,如果有进行交易的信号,它可以生成提醒或声音通知,或者向手机发送推送通知。
Skyscraper_Fix_Signal 指标使用 Skyscraper_Fix 指标在固定时段的指标值显示当前趋势的信息。
在一个 EA 交易中包含了两个分别使用 Skyscraper_Fix 和 AbsolutelyNoLagLWMA 指标的独立交易系统。
修正版的 Skyscrape 指标
在一个EA交易中包含两个独立的交易系统,它们分别使用 Skyscraper_Fix 和 ColorAML 指标,并且可以根据自身系统之前的交易结果来调节即将到来交易的交易量。
SKYScraper 是 SKY System 私有 API 的代理。 它提供了一个简化的 REST API,其端点类似于 SKY,适合开发 3rd 方应用程序。 此 SDK 是的包装器。 它包括验证和调用每个端点的所有必要功能,例如检索您的用户配置...
在输入参数中含有时段选择选项的 Skyscraper 指标
一个 NRTR 类型的趋势指标,带有额外的中心线。
Skyscraper_Fix_x10 根据指标输入参数中的定义,在十个不同时段中显示了 Skyscraper_Fix 指标信号的方向
在输入参数中带有时段选择选项的 Skyscraper_Fix 指标
Skyscraper_Fix 指标,在平均线和 NRTR 线之间填充颜色。
在输入参数中带有时段选择选项的 Skyscraper_Fix_Cld 指标
两个同样的交易系统 (用于买入和卖出仓位),基于 Skyscraper_Fix 指标的信号, 可以在一个 EA 中使用不同的方式配置。
语言:English 添加URL和PAGE HTMLS在摩天大楼App中的比较 ...扩展您可以将汽车更快,更容易跨越网络。...- 这是kattinson再次在延期汽车图标上,这次你是绿色的“+” - - - - - 英语 - - - - - - - -使自动计量器更容易...
Skyscraper Data Downloader 是一个用 Visual Basic 编写的程序,它使下载 Skyscraper、Skyscraper 建筑物、管理建筑物(并在 Notepad(++) 中打开)和访问站点变得轻而易举。
高中英语单词天天记skyscraper素材
mercial skyscraper, etc. For all ratings from 100 to 800A, there’s only one model and must be used in couple. The spring brackets can absorb the vertical construction expansion and adjust the busbar ...