A - Amsterdam Distance

题意:极坐标系,给出两个点,求最短距离

思路:只有两种方式,取min  第一种,先走到0点,再走到终点 第二种,走到同一半径,再走过去

 #include <bits/stdc++.h>

 using namespace std;
#define INF 0x3f3f3f3f const double PI = acos(-1.0); double n, m, r;
double n1, m1, n2, m2; inline double work1()
{
double dis1 = r * n1 / n;
double dis2 = r * n2 / n;
return dis1 + dis2;
} inline double work2()
{
double dis1 = r * (n2 - n1) / n;
double dis2 = fabs(m1 - m2) * r * n1 * PI/ (n * m);
return dis1 + dis2;
} int main()
{
while (scanf("%lf%lf%lf", &m, &n, &r) != EOF)
{
scanf("%lf%lf%lf%lf", &m1, &n1, &m2, &n2);
if (n1 > n2)
{
swap(n1, n2);
swap(m1, m2);
}
double ans = INF * 1.0;
ans = min(ans, work1());
ans = min(ans, work2());
printf("%.10f\n", ans);
}
return ;
}

B - Bearly Made It

留坑。

C - Collatz Conjecture

题意:给出n个数,求有多少个不同的区间gcd

思路:从头扫过去,每次扩展gcd,如果有重复的直接剪掉

因为假设扫到第i个的时候,有x个gcd  那么到第i个,这x个gcd 如果都被保留下来,那么第i个数一定要是这n个数的倍数,那么显然如果存在这样的数,那么当x > 30 的时候 早就爆 1e18 了 所以复杂度应该在 30 * (n) * log(n)

 #include<bits/stdc++.h>

 using namespace std;

 #define N 500050

 typedef long long ll;

 inline ll gcd(ll a, ll b)
{
return b == ? a : gcd(b, a % b);
} int n;
ll GCD[N];
ll num;
map<ll, int>mp; int main()
{
while(~scanf("%d" ,&n))
{
mp.clear();
int len = ;
for(int i = ; i <= n; ++i)
{
scanf("%lld", &num);
for(int j = ; j < len; ++j)
{
GCD[j] = gcd(GCD[j], num);
}
GCD[len++] = num;
sort(GCD, GCD + len);
int tmp = ;
for(int i = ; i< len; ++i)
{
mp[GCD[i]]++;
if(i == )
{
GCD[tmp++] = GCD[i];
continue;
}
if(GCD[i] == GCD[i - ]) continue;
else GCD[tmp++] = GCD[i];
}
len = tmp;
}
int ans = mp.size();
printf("%d\n",ans);
}
return ;
}

D - Detour

题意:给出n条路,每次选择的路都不选从这条路到0的最短路径上的路,求最后选的最短路径

思路:先从1反向跑最短路,然后删边,再从0正向跑

 #include <bits/stdc++.h>
using namespace std; #define N 100010
#define M 1000010
#define ll long long
#define INFLL 0x3f3f3f3f3f3f3f3f struct Edge
{
int to, nx, flag;
ll w;
inline Edge() {}
inline Edge(int to, ll w, int nx, int flag) : to(to), w(w), nx(nx), flag(flag) {}
}edge[M << ]; int head[N], pos; inline void Init()
{
memset(head, -, sizeof head);
pos = ;
} inline void addedge(int u, int v, ll w)
{
edge[++pos] = Edge(v, w, head[u], ); head[u] = pos;
edge[++pos] = Edge(u, w, head[v], ); head[v] = pos;
} int n, m; struct node
{
int to; ll w;
inline node() {}
inline node(int to, ll w) : to(to), w(w) {}
inline bool operator < (const node &r) const
{
return w > r.w;
}
}; ll dist[N];
int pre[N];
bool used[N]; inline void Dijkstra(int st)
{
for (int i = ; i < n; ++i) dist[i] = INFLL, used[i] = false, pre[i] = -;
dist[st] = ;
priority_queue <node> q; q.emplace(st, );
while (!q.empty())
{
int u = q.top().to; q.pop();
used[u] = true;
for (int it = head[u]; ~it; it = edge[it].nx)
{
if (edge[it].flag) continue;
int v = edge[it].to; ll w = edge[it].w;
if (!used[v] && dist[u] + w < dist[v])
{
dist[v] = dist[u] + w;
pre[v] = u;
q.emplace(v, dist[v]);
}
}
}
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
ll w; Init();
for (int i = , u, v; i <= m; ++i)
{
scanf("%d%d%lld", &u, &v, &w);
addedge(u, v, w);
}
Dijkstra();
if (dist[] == INFLL)
{
puts("impossible");
continue;
}
for (int i = ; i < n; ++i)
{
for (int it = head[i]; ~it; it = edge[it].nx)
{
int v = edge[it].to;
if (v == pre[i])
{
edge[it].flag = ;
break;
}
}
}
Dijkstra();
if (dist[] == INFLL)
{
puts("impossible");
continue;
}
vector <int> ans;
int it = ;
while (it != -)
{
ans.push_back(it);
it = pre[it];
}
reverse(ans.begin(), ans.end());
int len = ans.size();
printf("%d ", len);
for (int i = ; i < len; ++i) printf("%d%c", ans[i], " \n"[i == len - ]); }
return ;
}

E - Easter Eggs

留坑。

F - Falling Apart

水。

 #include <bits/stdc++.h>

 using namespace std;

 int n;
int arr[]; int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d", arr + i);
sort(arr + , arr + + n);
int ans[] = {, };
int flag = ;
for (int i = n; i >= ; --i)
{
ans[flag] += arr[i];
flag ^= ;
}
printf("%d %d\n", max(ans[], ans[]), min(ans[], ans[]));
}
return ;
}

G - Going Dutch

留坑。

H - Hoarse Horses

留坑。

I - Irrational Division

题意:给出n * m 的矩形,单位边长为1,黑白交替,Alice 只能一列一列取(从左往右),Bob只能一行一行取(从下往上),取到的分数为黑块-白块,求Alice 和 Bob 的最大分差,两人操作都最优

思路:可以找一下规律,偶数行 答案是0

奇数行 奇数列 答案是1

奇数行 偶数列  行 < 列 答案是2 否则 答案是0

 #include <bits/stdc++.h>

 using namespace std;

 int n, m;

 int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
if ((n & ) == )
{
puts("");
continue;
}
if ((m & ))
{
puts("");
continue;
}
puts(n < m ? "" : "");
}
return ;
}

J - Jumping Choreography

留坑。

K - King of the Waves

题意:给出n个人的胜负关系,打擂台赛,求最后0胜利,给出上场顺序

思路:输出DFS序

 #include<bits/stdc++.h>

 using namespace std;

 #define N 1010

 int n;
int tot = ;
int dep[N];
char mp[N][N];
int ans[N]; inline void DFS(int pos, int cnt)
{
dep[pos] = cnt;
ans[++tot] = pos;
for(int i = ; i <= n; ++i)
{
if(mp[pos][i] == '' && !dep[i])
{
DFS(i, cnt + );
}
}
} int main()
{
while(~scanf("%d", &n))
{
tot = ;
memset(dep, , sizeof dep);
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
{
scanf(" %c", &mp[i][j]);
}
}
DFS(, );
if(tot != n)
{
puts("impossible");
}
else
{
for(int i = n; i >= ; --i)
{
printf("%d%c", ans[i] - , " \n"[i == ]);
}
}
}
return ;
}

L - Lemonade Trade

题意:给出n个兑换关系,刚开始有1l pink  最后想换到blue 要依次换,可以选择换和不换

思路:O(n) 扫一下,记录在这之前被兑换的颜色饮料最多能被换到多少 然后取max  注意 不能直接乘法,取log 再取e的幂次

 #include<bits/stdc++.h>

 using namespace std;

 #define N 100010

 const int INF = 0x3f3f3f3f;
const double EI = exp(1.0); int cnt;
map<string, int >mp;
double ans[N]; inline void init()
{
mp.clear();
cnt = ;
mp["pink"] = cnt++;
mp["blue"] = cnt++;
ans[] = log(1.0);
ans[] = -INF * 1.0;
} int n;
string a, b;
double w; int main()
{
ios::sync_with_stdio(false);
cin.tie();cout.tie();
while(cin >> n)
{
init();
for(int i = ; i <= n; ++i)
{
cin >> a >> b >> w;
if(mp[a] == )
{
mp[a] = cnt++;
ans[mp[a]] = -INF * 1.0;
}
if(mp[b] == )
{
mp[b] = cnt++;
ans[mp[b]] = -INF * 1.0;
}
int id1 = mp[a], id2 = mp[b];
ans[id1] = max(ans[id1], ans[id2] + log(w));
}
ans[] = pow(EI, ans[]);
ans[] = min(ans[], 10.0);
cout << setiosflags(ios::fixed) << setprecision() << ans[] << endl;
}
return ;
}

M - Manhattan Mornings

题意:给出n个点,起始点和终点,求从起始点到终点的最短路径,最多经过多少点

思路:先排序,固定一个轴,再求最长上升子序列

 #include <bits/stdc++.h>
using namespace std; #define N 100010 int n; struct node
{
int x, y;
inline void scan()
{
scanf("%d%d", &x, &y);
}
inline bool operator < (const node &r) const
{
return x < r.x || x == r.x && y < r.y;
}
}point[N], st, ed; int arr[N], brr[N]; inline int DP1(int n)
{
if (n == ) return ;
int i, len, pos;
brr[] = arr[];
len = ;
for (int i = ; i <= n; ++i)
{
if (arr[i] >= brr[len])
{
len = len + ;
brr[len] = arr[i];
}
else
{
int pos = upper_bound(brr + , brr + + len, arr[i]) - brr;
brr[pos] = arr[i];
}
}
return len;
} inline bool cmp (node a, node b)
{
return a.x > b.x || a.x == b.x && a.y < b.y;
} int main()
{
while (scanf("%d", &n) != EOF)
{
st.scan(); ed.scan();
for (int i = ; i <= n; ++i)
point[i].scan();
if (st.x > ed.x) swap(st, ed);
if (st.y < ed.y)
{
sort(point + , point + + n);
int cnt = ;
for (int i = ; i <= n; ++i)
{
if (point[i].x >= st.x && point[i].x <= ed.x && point[i].y >= st.y && point[i].y <= ed.y)
arr[++cnt] = point[i].y;
}
printf("%d\n", DP1(cnt));
}
else
{
sort(point + , point + + n, cmp);
int cnt = ;
for (int i = ; i <= n; ++i)
{
if (point[i].x >= st.x && point[i].x <= ed.x && point[i].y >= ed.y && point[i].y <= st.y)
arr[++cnt] = point[i].y;
}
printf("%d\n", DP1(cnt));
}
}
return ;
}

2017 Benelux Algorithm Programming Contest (BAPC 17) Solution的更多相关文章

  1. 2014 Benelux Algorithm Programming Contest (BAPC 14)E

    题目链接:https://vjudge.net/contest/187496#problem/E E Excellent Engineers You are working for an agency ...

  2. 2018 Benelux Algorithm Programming Contest (BAPC 18)

    目录 Contest Info Solutions A A Prize No One Can Win B Birthday Boy C Cardboard Container D Driver Dis ...

  3. 2018 Benelux Algorithm Programming Contest (BAPC 18)I In Case of an Invasion, Please. . .

    题意:一副无向有权图,每个点有一些人,某些点是避难所(有容量),所有人要去避难所,问最小时间所有人都到达避难所, 题解:dij+二分+最大流check,注意到避难所最多10个,先挨个dij求到避难所的 ...

  4. Gym -102007 :Benelux Algorithm Programming Contest (BAPC 18) (寒假自训第5场)

    A .A Prize No One Can Win 题意:给定N,S,你要从N个数中选最多是数,使得任意两个之和不大于S. 思路:排序,然后贪心的选即可. #include<bits/stdc+ ...

  5. 2015 Benelux Algorithm Programming Contest (BAPC 15)E - Excellent Engineers

    这题想了很久没思路,不知道怎么不sort维护二维的最小值 emmmm原来是线段树/树状数组,一维sort,二维当成下标,维护三维的最小值 #include<bits/stdc++.h> # ...

  6. Benelux Algorithm Programming Contest 2014 Final(第二场)

    B:Button Bashing You recently acquired a new microwave, and noticed that it provides a large number ...

  7. Benelux Algorithm Programming Contest 2017(D)

    传送门:Problem D https://www.cnblogs.com/violet-acmer/p/9677435.html 题意: 研究人员需要使用某种细菌进行实验,给定一个序列代表接下来每个 ...

  8. 2020.3.14--训练联盟周赛 Preliminaries for Benelux Algorithm Programming Contest 2019

    1.A题 题意:给定第一行的值表示m列的最大值,第m行的值表示n行的最大值,问是否会行列冲突 思路:挺简单的,不过我在一开始理解题意上用了些时间,按我的理解是输入两组数组,找出每组最大数,若相等则输出 ...

  9. 03.14 ICPC训练联盟周赛,Preliminaries for Benelux Algorithm Programming Contest 2019

    A .Architecture 题意:其实就是想让你找到两行数的最大值,然后比较是否相同,如果相同输出'possible',不同则输出'impossible' 思路:直接遍历寻找最大值,然后比较即可 ...

随机推荐

  1. Objective-C中的KVC与KVO(上)

    本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...

  2. Oracle类型number与PG类型numeric对比和转换策略

    Oracle 11g number 任意精度数字类型 http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT3 ...

  3. Eclipse版GoogleI/O2014开源项目

    https://github.com/google/iosched谷歌原版是Gradle工程,用Eclipse开发的导入不了,所以搞了一个Elicpse工程,依赖的jar.库比较多,也比较难找... ...

  4. MQTT的学习研究(八)基于HTTP DELETE MQTT 订阅消息服务端使用

    HTTP DELETE 订阅主题请求协议和响应协议http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/topic/com.ibm.mq.csqzau ...

  5. TextureMerger1.6.6 二:Sprite Sheet的制作和使用

    本随笔记录下Sprite Sheet的制作和使用 Sprite Sheet主要用于将零碎的小图合并成一张整图.减少加载图片时http的请求次数. 1 打开TextureMerger,选择Sprite ...

  6. GOOGLE和百度的长域名

    GOOGLE的变态域名:www.mamashuojiusuannizhucedeyumingzaichanggoogledounengsousuochulai.cn/中文拼音:“妈妈说就算你注册的域名 ...

  7. Python 使用 Matplotlib 做图时,如何画竖直和水平的分割线或者点画线或者直线?

    作者:看看链接:https://www.zhihu.com/question/21929761/answer/164975814 可以使用: vlines(x, ymin, ymax) hlines( ...

  8. 从零打造在线网盘系统之Struts2框架配置全解析

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  9. SQL Fundamentals:替代变量(&,&&)以及DEFINE,UNDEFINE,ACCEPT指令

    替代变量 利用替代变量可以实现数据操作的交互性.替代变量的操作类似于键盘输入操作. 所谓的替代变量,指的就是在进行查询或更新操作时,某些数据是由用户所输入的,而这些数据前可以使用“&”标记. ...

  10. ruby rvm groke

    https://ruby-china.org/wiki/rvm-guide http://www.cnblogs.com/peak-c/p/7338291.html https://doc.yonyo ...