博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
World final 2017 题解
阅读量:4350 次
发布时间:2019-06-07

本文共 7115 字,大约阅读时间需要 23 分钟。

链接:

Problem A:

#include 
#include
#include
#include
using namespace std;const int maxn = 222;struct Point{ long long x, y; Point(long long x = 0, long long y = 0) : x(x), y(y) { } void read() { scanf("%lld %lld", &x, &y); }};typedef Point Vector;Vector operator - (const Point &A, const Point &B){ return Vector(A.x - B.x, A.y - B.y);}long long Cross(const Vector &A, const Vector &B){ return A.x * B.y - A.y * B.x;}long long Dot(const Vector &A, const Vector &B){ return A.x * B.x + A.y * B.y;}double inter(Point p, Vector v, Point q, Vector w){ Vector u = p - q; return 1.0 * Cross(w, u) / Cross(v, w);}bool on(Point p, Point a, Point b){ return Cross(p - a, p - b) == 0;}int dcmp(long long x){ if (x == 0) return 0; return x > 0 ? 1 : -1;}int n;Point p[maxn];double ans = 0.0;void solve(Point A, Point B){ vector
lst; for (int i = 0; i < n; ++i) { if (dcmp(Cross(p[i] - A, B - A)) * dcmp(Cross(p[i + 1] - A, B - A)) >= 0) continue; lst.push_back(inter(A, B - A, p[i], p[i + 1] - p[i])); } for (int i = 0; i < n; ++i) { if (!on(p[i], A, B)) continue; Point L = p[(i + n - 1) % n]; Point N = p[(i + 1) % n]; Point P = p[i]; long long dir = Cross(B - A, L - A); double pos = 1.0 * Dot(P - A, B - A) / Dot(B - A, B - A); if (dir == 0) { if (Dot(B - A, P - L) > 0) { if (Cross(B - A, N - A) > 0) lst.push_back(pos); } else { if (Cross(B - A, N - A) < 0) lst.push_back(pos); } } else if (dir > 0) { if (Cross(B - A, N - A) < 0) lst.push_back(pos); else if (Cross(B - A, N - A) == 0 && Dot(B - A, N - P) > 0) lst.push_back(pos); } else { if (Cross(B - A, N - A) > 0) lst.push_back(pos); else if (Cross(B - A, N - A) == 0 && Dot(B - A, N - P) < 0) lst.push_back(pos); } } sort(lst.begin(), lst.end()); double len = sqrt(Dot(B - A, B - A)); for (int i = 0; i < (int)lst.size(); i += 2) ans = max(ans, (lst[i + 1] - lst[i]) * len);}int main(){ scanf("%d", &n); for (int i = 0; i < n; ++i) p[i].read(); p[n] = p[0]; for (int i = 0; i < n; ++i) for (int j = i + 1; j < n; ++j) solve(p[i], p[j]); printf("%.10f\n", ans); return 0;}

Problem C:

#include 
using namespace std;typedef long long ll;const int N = 305, M = 100005;const ll inf = 1ll << 60;int head[N];struct Edge { int nxt, to, cow; ll cost; Edge() {} Edge(int nxt, int to, int cow, ll cost) : nxt(nxt), to(to), cow(cow), cost(cost) {}} ed[M];int ecnt, mx_flow;ll mi_cost;void init() { mx_flow = mi_cost = ecnt = 0; memset(head, -1, sizeof(head));}void addE(int u, int v, int cow, ll cost) { ed[ecnt] = Edge(head[u], v, cow, cost); head[u] = ecnt ++; ed[ecnt] = Edge(head[v], u, 0, -cost); head[v] = ecnt ++;}queue
Q;ll dis[N];int pre[N], inq[N], tot;bool spfa(int S, int T) { for (int i = 0; i < tot; ++ i) dis[i] = inf; dis[S] = 0; Q.push(S); while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = 0; for (int e = head[u]; ~e; e = ed[e].nxt) { if (!ed[e].cow) continue; int v = ed[e].to; if (dis[v] > dis[u] + ed[e].cost) { dis[v] = dis[u] + ed[e].cost; pre[v] = e; if (!inq[v]) { inq[v] = 1; Q.push(v); } } } } return dis[T] < 0;}void aug(int S, int T) { int flow = 1 << 30; for (int u = T; u != S; u = ed[pre[u] ^ 1].to) flow = min(flow, ed[pre[u]].cow); for (int u = T; u != S; u = ed[pre[u] ^ 1].to) { ed[pre[u]].cow -= flow; ed[pre[u] ^ 1].cow += flow; mi_cost += flow * ed[pre[u]].cost; } mx_flow += flow;}int A[105][105];int mxr[105], mxc[105];int idr[105], idc[105];int main() { init(); int n, m; scanf("%d%d", &n, &m); long long sum = 0; for (int i = 0; i < n; ++ i) for (int j = 0; j < m; ++ j) scanf("%d", A[i] + j), sum += A[i][j]; for (int i = 0; i < n; ++ i) { mxr[i] = - (1 << 30); for (int j = 0; j < m; ++ j) mxr[i] = max(mxr[i], A[i][j]); } for (int j = 0; j < m; ++ j) { mxc[j] = - (1 << 30); for (int i = 0; i < n; ++ i) mxc[j] = max(mxc[j], A[i][j]); } tot = 0; for (int i = 0; i <= n; ++ i) idr[i] = tot ++; for (int i = 0; i <= m; ++ i) idc[i] = tot ++; int src = tot ++, des = tot ++; int use = 0; for (int i = 0; i < n; ++ i) if (mxr[i]) addE(src, idr[i], 1, - (1 << 30)), ++ use; for (int i = 0; i < m; ++ i) if (mxc[i]) addE(idc[i], des, 1, - (1 << 30)), ++ use; addE(src, idr[n], 1 << 30, 0); addE(idc[m], des, 1 << 30, 0); long long ans = 0; for (int i = 0; i < n; ++ i) { for (int j = 0; j < m; ++ j) { if (A[i][j] == 0) continue; ++ ans; if (mxr[i] < mxc[j]) { addE(idr[i], idc[m], 1, mxr[i] - 1); } else if(mxr[i] > mxc[j]) { addE(idr[n], idc[j], 1, mxc[j] - 1); } else { addE(idr[i], idc[j], 1, mxr[i] - 1); addE(idr[i], idc[m], 1, mxr[i] - 1); addE(idr[n], idc[j], 1, mxr[i] - 1); } } } while(spfa(src, des)) aug(src, des); mi_cost += (1ll << 30) * use; ans += mi_cost; cout << sum - ans << endl; return 0;}

Problem E:

#include
using namespace std;const int maxn = 1005;int n;double t,d[maxn],s[maxn];double check(double x){ double res = 0; for(int i=0;i
>n>>t; for(int i=0;i
>d[i]>>s[i]; double l=-1e9,r=1e9; for(int cas=0;cas<=100;cas++){ double mid = (l+r)/2.0; if(check(mid)>t)l=mid; else r=mid; } printf("%.12f\n",l);}

Problem F:

#include
using namespace std;const int maxn = 260;long long d[maxn];long long dp[maxn][maxn];long long cal[maxn][maxn];int n,m;int a,b;int main(){ scanf("%d%d",&n,&m); for(int i=0;i

Problem I:

#include
using namespace std;const int maxn = 30;int mp[maxn][maxn];int main(){ int n,m; scanf("%d%d",&n,&m); string a,b; for(int i=0;i
>a>>b; mp[a[0]-'a'][b[0]-'a']=1; } for(int k=0;k<26;k++){ mp[k][k]=1; for(int i=0;i<26;i++){ for(int j=0;j<26;j++){ if(mp[i][k]&&mp[k][j]) mp[i][j]=1; } } } string s1,s2; for(int i=1;i<=m;i++){ cin>>s1>>s2; if(s1.size()!=s2.size()){ cout<<"no"<

转载于:https://www.cnblogs.com/qscqesze/p/6933588.html

你可能感兴趣的文章
小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
查看>>
技术分析淘宝的超卖宝贝
查看>>
Azure云服务托管恶意软件
查看>>
初识前端作业1
查看>>
VMware黑屏解决方法
查看>>
4.1 分解条件式
查看>>
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>
微信测试账户
查看>>
学习使用Django一 安装虚拟环境
查看>>
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>
前端基础之BOM和DOM
查看>>
[T-ARA/筷子兄弟][Little Apple]
查看>>
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>