AtCoder Beginner Contest 340

2024-04-22 01:44
文章标签 atcoder beginner contest 340

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

前面两道阅读理解直接跳过

C - Divide and Divide

大意

黑板上有一个数n

执行下列操作,直到黑板上的数全为1:

  • 选择一个不小于2的整数x,擦掉。
  • 写下\lfloor \frac{x}{2} \rfloor\lceil \frac{x}{2} \rceil
  • 需要x的代价。

当不能继续操作时,总代价是多少?

思路

定义dp_i表示黑板上初始出现数字i的代价,则有dp_i=dp_{\lfloor \frac{x}{2}\rfloor}+dp_{\lceil \frac{x}{2}\rceil} + x

但是数很大,不能递推,需要记忆化搜索(有用的总状态数不会超过2\log n)。

使用map进行记忆化即可。

代码

#include <iostream>
#include <unordered_map>
using namespace std;typedef long long ll;
unordered_map<ll, ll> dp;ll dfs(ll x) {if (x < 2) return 0;if (dp.count(x)) return dp[x];return dp[x] = x + dfs(x / 2) + dfs((x + 1) / 2);
}int main() {ll n;cin >> n;cout << dfs(n) << endl;return 0;
}

D - Super Takahashi Bros.

大意

n个关卡,初始只能玩第1关。

对于第i关卡,有两种通关方式:

  • 花费A_i时间打完,跳到第i+1关。
  • 花费B_i时间打完,跳到第X_i关。

思路

转化为有向图,对于第i关卡,

  • 在点i和点i+1之间,建一条权值为A_i的边。
  • 在点i和点X_i之间,建一条权值为B_i的边。

最后跑一遍从1n的最短路即可。

代码

#include <iostream>
#include <queue>
#include <utility>
#include <cstring>
using namespace std;const int N = 2e5 + 9;
typedef long long ll;
typedef pair<ll, ll> pll;
ll n, a[N], b[N], x[N], dis[N];
bool vis[N];
priority_queue<pll, vector<pll>, greater<pll>> q;int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n;for (ll i = 1; i <= n - 1; i++) cin >> a[i] >> b[i] >> x[i];memset(dis, 0x3f, sizeof dis);dis[1] = 0;q.push({ 0, 1 });while (q.size()) {auto t = q.top();q.pop();ll u = t.second;if (vis[u]) continue;vis[u] = true;ll v = u + 1;if (dis[v] > dis[u] + a[u]) {dis[v] = dis[u] + a[u];q.push({ dis[v], v });}v = x[u];if (dis[v] > dis[u] + b[u]) {dis[v] = dis[u] + b[u];q.push({ dis[v], v });}}cout << dis[n] << endl;return 0;
}

E - Mancala 2

大意

n个盒子,第i个盒子有A_i个球。

依次执行以下操作共m次:

  • i次操作,将第B_i个盒子的所有球均分,多余的球从第B_i+1个盒子开始依次放一个。
  • 如果处理到最后一个盒子还没放完,从第1个盒子开始继续放。

问最后每个盒子的球数量。

思路

假设被取出球的盒子为x,取出了y个球,则放球时相当于:

  • 先给每个盒子\lfloor \frac{y}{n} \rfloor个球
  • 把剩下y \mod n个球依次放入对应盒子。(注意分成两个部分算)

这是一个单点查询单点修改区间修改的操作,使用树状数组+差分维护即可。

代码

#include<iostream>
#include<vector>
using namespace std;
#define int long longtemplate<class T>
struct fenwick{vector<T> tr;int n;fenwick(int _n): n(_n){tr.resize(n + 1);}void add(int a, T b){while(a <= n){tr[a] += b;a += (a & -a);}}T ask(int a){T res{};while(a){res += tr[a];a -= (a & -a);}return res;}
};signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;cin >> n >> m;fenwick<int> fwk(n + 1);for(int i = 1; i <= n; i++){int x; cin >> x;fwk.add(i, x);fwk.add(i + 1, -x);}while(m--){int x; cin >> x; x++;int y = fwk.ask(x);fwk.add(x, -y), fwk.add(x + 1, y);fwk.add(1, y / n), fwk.add(n + 1, -y / n);fwk.add(x + 1, 1), fwk.add(min(n, x + y % n) + 1, -1);if(x + y % n > n) fwk.add(1, 1), fwk.add(y % n - (n - x) + 1, -1);}for(int i = 1; i <= n; i++) cout << fwk.ask(i) << " ";return 0;
}

F - S = 1

大意

给定点(x,y),求一整数点(a,b),使得(0,0),(a,b),(x,y)形成的三角形的面积为1

思路

画一张图:

明显这个三角形面积等于这个长方形的面积减去周边三个小三角形的面积。

S=ay-\dfrac{ab}{2}-\dfrac{xy}{2}-\dfrac{(a-x)(y-b)}{2}

化简可得S=\dfrac{ay-bx}{2},但由于要考虑第二象限,所以S应为|\dfrac{ay-bx}{2}|

使用扩展欧几里德求|ay-bx|=2的一组特解即可。

无解情况:如果2 \mod \gcd(a,b) \ne 0,那么无解。

代码

#include<iostream>
using namespace std;
#define int long longint exgcd(int a, int b, int &x, int &y){if (!b){x = 1; y = 0;return a;}int d = exgcd(b, a % b, y, x);y -= (a / b) * x;return d;
}signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int x, y, a, b;cin >> a >> b;int d = exgcd(a, b, y, x);x = -x;if(2 % d) cout << -1 << endl;else{x = x * (2 / d);y = y * (2 / d);cout << x << ' ' << y << endl;}return 0;
}

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



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

相关文章

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

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

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只怪物总

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:   过计算

【UVa】10600 ACM Contest and Blackout 次小生成树

类型:次小生成树 题目大意: 为了举办ACM竞赛,市长决定给所有的n(3 <= n <= 100)所学校提供可靠的电力供应。当且仅当一个学校直接连到电站,或者连到另一个有可靠供应的学校时,才有可靠供应。现在给出在不同学校之间的布线成本,找出最便宜的两种连线方案。一个方案的成本等于其中所有学校之间连线的成本的总和。 题目分析: 次小生成树。 先求出最小生成树,然后枚举所有不在