USACO2023Feb Silver

2023-12-07 04:10
文章标签 silver usaco2023feb

本文主要是介绍USACO2023Feb Silver,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

T1 T2 AC, T3 RE, 722/1000 pts, promoted to Gold.

T1 Bakery

二分答案 - WA(0pts)

t C , t M t_C,t_M tC,tM记作 C , M C,M C,M以便书写。

( x , y ) (x,y) (x,y)满足若干个形如 a i ( C − x ) + b i ( M − y ) ≤ c i a_i(C-x)+b_i(M-y)\leq c_i ai(Cx)+bi(My)ci的不等式,求 ( x + y ) m i n (x+y)_{min} (x+y)min.
具备单调性,考虑二分答案。
x + y = s x+y=s x+y=s, 则不等式化为 ( a i − b i ) x ≥ a i C + b i M − b i s − c i (a_i-b_i)x\geq a_iC+b_iM-b_is-c_i (aibi)xaiC+biMbisci, 讨论 a i − b i a_i-b_i aibi的正负,解出 x x x的范围,大于等于或小于等于某个值。这里涉及到除法,我选择实数存储。
有多个这样的不等式,可得x的区间 [ m n , m x ] [mn,mx] [mn,mx],若区间不为空,即 m n ≤ m x mn\leq mx mnmx,则x有解,s合法——我当时是这样认为的。

时间复杂度 O ( T N l o g t ) O(TNlogt) O(TNlogt).


无法把变量命名为tm,本机上编译错误,卡了我很久。

交上去WA,我先做了后面两题再回来,以为是浮点数的精度不够,改成分数交叉相乘比较大小,还是WA。

又读了一遍题目,发现C和M不能被减成非正数(做到一半忘了这一点),也就是说x有一个初始区间 [ C − 1 , s − M + 1 ] [C-1, s-M+1] [C1,sM+1], 以及 [ 0 , s ] [0,s] [0,s]. 把这个加了上去,还是WA,我无计可施。

int tt, n;
ll a[MAXN], b[MAXN], c[MAXN], tc, m;bool check(ll s) {db mx = min(s, tc - 1), mn = max(0LL, s - m + 1);for (int i = 1; i <= n; ++i) {db val = (db)1.0 * (a[i] * tc - b[i] * s - c[i] + b[i] * m) / (a[i] - b[i]);if (a[i] > b[i]) ckmax(mn, val);else if (a[i] < b[i]) ckmin(mx, val);else if (a[i] * tc - b[i] * s > c[i] - b[i] * m) return false;}return mn <= mx + 1e-8;
}int main() {scanf("%d", &tt);while (tt--) {scanf("%d%lld%lld", &n, &tc, &m);for (int i = 1; i <= n; ++i) {scanf("%lld%lld%lld", a + i, b + i, c + i);}ll l = 0, r = tc + m - 2;while (l < r) {ll mid = (l + r) >> 1;if (check(mid)) r = mid;else l = mid + 1;}printf("%lld\n", l);}return 0;
}
ll gcd(ll x, ll y) {return x % y == 0 ? y : gcd(y, x % y);
}struct Node {ll a, b;Node(ll _a, ll _b) {if (_b < 0) a = -_a, b = -_b;else a = _a, b = _b;if (a * b) {ll g = gcd(abs(a), abs(b)); a /= g; b /= g;}}bool operator < (const Node &x) const {return a * x.b < b * x.a;}
};bool check(ll s) {Node mx = Node(min(s, tc - 1), 1), mn = Node(max(0LL, s - m + 1), 1);for (int i = 1; i <= n; ++i) {Node val = Node(a[i] * tc - b[i] * s - c[i] + b[i] * m, a[i] - b[i]);if (a[i] > b[i]) ckmax(mn, val);else if (a[i] < b[i]) ckmin(mx, val);else if (val.a > 0) return false;}return !(mx < mn);
}

二分答案 - AC

She can’t upgrade her oven a fractional amount of times,

我曾反复读题,每次读到这句话,我都认为这是一句废话,没考虑到自己就是因这一点而错了。
x是整数,所以解集并不是非空即可,而是有整数解

bool check(ll s) {// ...... ......return ceil(mn) <= floor(mx);
}

T2 Cow-libi

二分查找 - AC

把所有案件按时间排序。

已知牛在时间点 t t t 的位置,它要完成所有犯罪的必要条件是:它可能完成发生在 t t t 之前最晚,以及 t t t 之后最早的犯罪。
例如,有4起案件分别发生在100、200、300、400这三个时候。150时间点的牛如果无法证明自己无辜,那他可能完成100、200的犯罪;如果牛在300时间点,那就只考虑300这一起案件。

这个必要条件具备充分性吗?换言之,能完成前后最近的犯罪,就能完成所有犯罪吗?注意到题面中"It will always be possible for a single cow to travel between all grazings",所以这个条件充要。

所以,只需要检测最多两起案件,就能完成检测:办不到其中任意一个,牛就是无辜的。时间复杂度 O ( N l o g G ) O(NlogG) O(NlogG).

struct Node {ll x, y, t;bool operator < (const Node &X) const {return t < X.t;}
} a[MAXG];int g, n, ans;int search(ll tar) {if (tar > a[g].t) return g + 1;int l = 1, r = g;while (l < r) {int mid = (l + r) >> 1;if (a[mid].t >= tar) r = mid;else l = mid + 1;}return l;
}bool check(ll x, ll y, ll t, int p) {return (x - a[p].x) * (x - a[p].x) + (y - a[p].y) * (y - a[p].y) > (t - a[p].t) * (t- a[p].t);
}int main() {scanf("%d%d", &g, &n);for (int i = 1; i <= g; ++i) {scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].t);}sort(a + 1, a + g + 1);for (int i = 1; i <= n; ++i) {ll x, y, t; scanf("%lld%lld%lld", &x, &y, &t);int pos = search(t);bool flag = false;if (pos > 1) flag |= check(x, y, t, pos - 1);if (pos <= g) flag |= check(x, y, t, pos);ans += flag;}printf("%d\n", ans);return 0;
}

T3 Moo Route II

虚边、搜索 - RE

把所有到达时间加上到达机场的滞留时间,避免滞留时间带来的麻烦。

(k,m)表示一个状态(图中的一个节点),在k机场,时间是m。根据航班建边。
但是这还不够,因为Bessie可以在某个机场停留一段时间后,再进行下一次飞行。也就是说,时间流逝会带来在同一机场不同时间带来的状态改变。
我的第一反应是建虚边和虚点以实现状态的改变。如图,11连到12,12连到13……这显然会爆空间。
实际上,航班信息中如果只提到了(2,11)和(2,17),那只需在这两个点之间建虚边即可,无需建虚点。所以在某个机场提到的所有时间点排序后,依次连边即可。
在这里插入图片描述
建完图后,从(1,0)开始搜索,连通到的点中打擂台。

最多 2 × M + 1 2\times M+1 2×M+1个点,时间复杂度 O ( M l o g M ) O(MlogM) O(MlogM). 不知为何RE.

struct Node {int k, t;
} nodes[MAXM << 1];int n, m, c[MAXN], r[MAXN], d[MAXN], s[MAXN], a[MAXN], cnt, ans[MAXN];
bool vis[MAXM << 1];
vector<int> g[MAXN], h[MAXM << 1];
map<pair<int, int>, int> ind;int get(int k, int t) {pair<int, int> p = make_pair(k, t);if (ind.find(p) == ind.end()) {nodes[++cnt].k = k; nodes[cnt].t = t;g[k].push_back(t);ind.insert(make_pair(p, cnt));return cnt;}return ind[p];
}void add(int u, int v) {h[u].push_back(v);
}void dfs(int u) {vis[u] = true;ckmin(ans[nodes[u].k], nodes[u].t);for (int i = 0; i < h[u].size(); ++i) {int v = h[u][i];if (!vis[v]) {dfs(v);}}
}int main() {memset(ans, 0x3f, sizeof(ans));scanf("%d%d", &n, &m);for (int i = 1; i <= m; ++i) {scanf("%d%d%d%d", c + i, r + i, d + i, s + i);}for (int i = 1; i <= n; ++i) {scanf("%d", a + i);}g[1].push_back(0); get(1, 0);for (int i = 1; i <= m; ++i) s[i] += a[d[i]];for (int i = 1; i <= m; ++i) {int u = get(c[i], r[i]), v = get(d[i], s[i]);add(u, v);}for (int i = 1; i <= n; ++i) {sort(g[i].begin(), g[i].end());for (int j = 0; j < g[i].size() - 1; ++j) {int u = get(i, g[i][j]), v = get(i, g[i][j + 1]);add(u, v);}}dfs(1);a[1] = 0;for (int i = 1; i <= n; ++i) {if (ans[i] < INF) printf("%d\n", ans[i] - a[i]);else printf("-1\n");}return 0;
}

RE的原因 - AC

g[i].size() - 1
不能直接减,应将STL容器的size强转为int.

另一种搜索(补)

上面的方法将每个机场根据时间维度拆成多个点。

也可以不拆。对于每条边,记录起飞和到达时间,对每个点以起飞时间为关键字排序出边。这样,某时间在一个机场,枚举所有能走的出边。
显然每条边只会被走一次,所以对每个机场记录一个指针,标记从某个时间往后的出边都被走过了,保证时间复杂度。

这篇关于USACO2023Feb Silver的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464445

相关文章

【POJ3268】【Silver Cow Party】【反向dij】【sizeof失效】

Silver Cow Party Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 15522 Accepted: 7039 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going

David Silver强化学习公开课(五):不基于模型的控制

某种程度上来说,这个课程所有的内容最后都会集中于本讲内容,通过本讲的学习,我们将会学习到如何训练一个Agent,使其能够在完全未知的环境下较好地完成任务,得到尽可能多的奖励。本讲是基础理论部分的最后一讲,本讲以后的内容都是关于实际应用强化学习解决大规模问题的理论和技巧。本讲的技术核心主要基于先前一讲以及更早的一些内容,如果对先前的内容有深刻的理解,那么理解本讲内容将会比较容易。   简介 In

David Silver强化学习公开课(四):不基于模型的预测

简介 Introduction 通过先前的讲解,我们明白了如何从理论上解决一个已知的MDP:通过动态规划来评估一个给定的策略,并且得到最优价值函数,根据最优价值函数来确定最优策略;也可以直接进行不基于任何策略的状态价值迭代得到最优价值函数和最优策略。 从本讲开始将花连续两讲的时间讨论解决一个可以被认为是MDP、但却不掌握MDP具体细节的问题,也就是讲述如何直接从Agent与环境的交互来得到一个

David Silver强化学习公开课(三):动态规划寻找最优策略

本讲着重讲解了利用动态规划来进行强化学习,具体是进行强化学习中的“规划”,也就是在已知模型的基础上判断一个策略的价值函数,并在此基础上寻找到最优的策略和最优价值函数,或者直接寻找最优策略和最优价值函数。本讲是整个强化学习课程核心内容的引子。   简介 Introduction 动态规划算法是解决复杂问题的一个方法,算法通过把复杂问题分解为子问题,通过求解子问题进而得到整个问题的解。在解决子问

USACO 2014 February Contest, Silver

题目地址: click here  第一次 做USACO的 silver。 感觉不出 铜银区难度的差距。。。 结果  CHN  2016   Tian Yanfei667 ****tttttt  **********  *t**ttt***   1,Auto-Complete   View problem    给你 w个任意顺序的字符串,然后 n个询问, 问在这w个字典序排

POJ - 3268 Silver Cow Party (往返最短路,Floyd,Dijkstra 2次优化)

题目传送门 题意:求往返最短路的最大值。 1、先想到Floyd结果超时了。 2、先用1次Dijkstra求出各点到X的距离,然后再用N-1次算出X到各点的距离。 485ms AC。 3、先用1次Dijkstra算各点到X的距离,然后用相反的邻接表的Dijkstra算出点X到各点的距。 0ms AC了! 直接Floyd:TLE #define _CRT_SECURE_N

洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver(并查集)

展开 题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of NN barns connec

poj 3268 Silver Cow Party(单源最短路径Dijkstra·最小环)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11757 Silver Cow Party Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Description

POJ 3268 Silver Cow Party (来回最短路 SPFA)

Silver Cow Party Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 14384 Accepted: 6490 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is goin

【POJ】 3268 Silver Cow Party

Silver Cow Party Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 16290 Accepted: 7460 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to