AtCoder Beginner Contest 369 ABCDE

2024-09-01 13:12

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

背景

A题:369 

思路

假设A<=B

分类讨论,有如下两种情况

        1.A==B,情况唯一,另外一个数只能取A

        2.A<B,首先我们可以以B-A为公差d构造,另外一个数可以取A-d或者B+d。(然后接着考虑放在A和B中间的情况,样例中给了,只要B-A为偶数即可)

代码

inline void solve() {int a, b; cin >> a >> b;if (a > b) swap(a, b);if (a == b) cout << 1 << endl;else cout << 2 + ((b - a) % 2 == 0) << endl;return;
}

B题:Piano 3

思路

这个是一步一步操作的,所以说左手和右手一定是放在第一次进行对应手操作的位置上的。

按题意模拟即可

代码

inline void solve() {int n; cin >> n;int ans = 0;int l = -1, r = -1;for (int i = 1; i <= n; i ++ ) {int x; char op; cin >> x >> op;if (op == 'L') {if (l != -1) ans += abs(l - x);l = x;}else {if (r != -1) ans += abs(r - x);r = x;}}cout << ans << endl;return;
}

C题:Count Arithmetic Subarrays 

思路

双指针

为什么:

        因为对于一个等差数列区间,我们可以用双指针进行维护,并且等差区间内部也是等差的。如果在某一个点不满足等差条件的话,那么对于这个点的右边的所有点都无法算到这个等差数列区间去了。

3 6 9 3 1 1 1

这个我们只能找到3 6 9,后面那个3无法加入到前面的等差区间,所以后面的也不行。“等差区间内部也是等差的”,所以我们可以直接O(n)进行计算

怎么做:定义j为1,i从2开始遍历

        一开始我们可以找到3 6 9,看上面的样例,这个对答案的贡献为3+2+1-1。为什么要减去一呢?要去重。(这点可以结合代码进行理解)之后我们将j移到9的位置上(因为9也可能作为等差区间的开头),i继续进行遍历即可。

代码

inline void solve() {int n; cin >> n;vector<ll> a(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i];int j = 1;ll ans = 0;for (int i = 2; i <= n; i ++ ) {if (a[i] - a[i - 1] != a[j + 1] - a[j]) {ll len = i - j;ans += (1 + len) * len / 2 - 1;j = i - 1;}}ll len = n + 1 - j;ans += (1 + len) * len / 2;cout << ans << endl;return;
}

D题:Bonus EXP

思路

可打可不打么?两种选择,一眼dp

我定义的是dp[N][2],其中dp[i][1]代表着前i个怪兽打奇数次的最大exp,同理dp[i][0]对应偶数次

转移方程(很容易想到)

dp[i][1] = max(dp[i-1][1], dp[i-1][0] + a[i])--不打或者打

dp[i][0] = max(dp[i-1][0], dp[i-1][1] + 2 * a[i])--不打或者打

其中要注意,偶数次的转移必须满足i>=2

你这只少要打两次才能双倍经验吧

代码

const int N = 2e5 + 9;
ll dp[N][2];
inline void solve() {int n; cin >> n;for (int i = 1; i <= n; i ++ ) {ll x; cin >> x;dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + x);if (i >= 2) dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + 2 * x);}cout << max(dp[n][0], dp[n][1]) << endl;return;
}

E题:Sightseeing Tour

思路

暴力枚举

它这题目到底什么意思呢?

要求你必须走这k条边

你一开始从1出发,要经过这k条边,然后到达点n

那就只是思考这k条边怎么走的问题了,首先枚举顺序,接着枚举从那边进那边出即可(这步可以直接暴力实现,k<=5)

这样我们的路径上就必定会经过这k条边,我们一次将其“连起来即可”

连起来的操作我们用从几号点到几号点的最小距离即可(Floyd)

代码

ll d[410][410];
inline void solve() {int n, m; cin >> n >> m;memset(d, 63, sizeof d);for (int i = 1; i <= n; i ++ ) d[i][i] = 0;vector<array<ll, 3>> a(m + 1);for (int i = 1; i <= m; i ++ ) {ll u, v, t; cin >> u >> v >> t;a[i] = {u, v, t};d[u][v] = d[v][u] = min(d[v][u], t);}for (int k = 1; k <= n; k ++ ) {for (int i = 1; i <= n; i ++ ) {for (int j = 1; j <= n; j ++ ) {d[i][j] = min(d[i][j], d[i][k] + d[k][j]);}}}int q; cin >> q;while (q -- ) {int k; cin >> k;vector<int> b(k + 1);ll ans = 0, add = (ll)1e18;for (int i = 1; i <= k; i ++ ) cin >> b[i], ans += a[b[i]][2];do {for (int i = 0; i < (1 << k); i ++ ) {ll extra = 0, last = 1;for (int j = 1; j <= k; j ++ ) {int st = a[b[j]][0], ed = a[b[j]][1];if (i >> (j - 1) & 1) swap(st, ed);extra += d[st][last];last = ed;}extra += d[last][n];add = min(add, extra);}}while (next_permutation(b.begin() + 1, b.end()));cout << ans + add << endl;}return;
}

        

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



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

相关文章

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

AtCoder Beginner Contest 369 D - Bonus EXP 动态规划

原题链接: https://atcoder.jp/contests/abc369/tasks/abc369_d 思路:   这道题为什么要用动态规划呢,其实,对于第i个怪物,我们有打与不打两种处理方式,而对于打,我们是获得两倍的经验值,还是一倍的经验值,与我们打了奇数只怪物还是打了偶数只怪物有关了,因此我们定义dp[i][0] 为前i只怪物总共打了偶数次,dp[i][1] 为前i只怪物总

2024高教社杯数学建模国赛ABCDE题选题建议+初步分析

提示:DS C君认为的难度:C<B<A,开放度:A<C<B 。 D、E题推荐选E题,后续会直接更新E论文和思路,不在这里进行选题分析,以下为A、B、C题选题建议及初步分析 A题:“板凳龙” 闹元宵 A题是数模类赛事很常见的物理类赛题,需要学习不少相关知识。此题涉及对一个动态系统的建模,模拟一支舞龙队伍在螺旋路径中的行进,并求解队伍的整体动态行为。包括队伍的每秒位置、速度、碰撞检测、路径优化等

【2024年数学建模国赛赛题发布】ABCDE题独家思路与模型分享

目录 赛题A题B题C题 D题E题选题与解题思路 赛题 A题 B题 C题 D题 E题 选题与解题思路 国奖学长解题思路与后续详细解题过程、建模代码,论文持续更新中 需要赛题和完整资料可以点击下方卡片获取~-

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算