比赛链接:kick start Round A 2020

A. Allocation

题目链接

题意

给出 \(N\) 栋房子的价格,第 \(i\) 栋房子的价格为 \(A_i\),你有 \(B\) 美元,问最多可以买多少栋房子?

思路

典型的贪心问题,将所有的房子按价格从低到高排序后选取即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int _, Case;
void solve() {
Case++;
int n, b;
cin >> n >> b;
int a[n];
for (int i = 0; i < n; ++i) cin >> a[i];
sort(a, a + n);
int ans = 0;
for (int i = 0; i < n; ++i) {
if (b < a[i])
break;
else
b -= a[i], ans++;
}
cout << "Case #" << Case << ": " << ans << endl;
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> _;
while (_--) solve();
}

B. Plates

题目链接

题意

有 \(N\) 叠盘子,每叠有 \(K\) 个盘子,每个盘子有个 beauty value,现在要拿 \(P\) 个盘子,使得 beauty value 之和最大。拿盘子的条件:如果一个盘子的上面的盘子都被拿走了,才能拿到这个盘子。

思路

本题有一点点像多重背包。首先计算每叠盘子各自的前缀和 \(sum[N][K]\),设 \(dp[i][j]\) 表示前 \(i\) 堆盘子中取 \(j\) 个盘子的 beauty value 的最大值,转移方程为:

\[dp[i][j]=max\{dp[i][j],dp[i−1][j−l]+sum[i][l]|\ for\ l ∈\ [0,min(j,k)]\}
\]

代码

#include <bits/stdc++.h>
#define ms(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int N = 1510;
int _, Case = 0;
int n, p, k, x;
int sum[N][N], a[N][N], dp[N][N];
void solve() {
ms(sum, 0), ms(a, 0), ms(dp, 0);//初始化
cin >> n >> k >> p;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= k; ++j) cin >> a[i][j];
cout << "Case #" << ++Case << ": ";
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= k; ++j) sum[i][j] = sum[i][j - 1] + a[i][j];
for (int i = 0; i <= k; ++i) dp[1][i] = sum[1][i];
for (int i = 2; i <= n; ++i)
for (int j = 1; j <= p; ++j) //这里不需要太大,到p就够了
for (int l = 0; l <= min(j, k); ++l)//接下来就是写状态转移方程了
dp[i][j] = max(dp[i][j], dp[i - 1][j - l] + sum[i][l]); cout << dp[n][p] << endl;
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
for (cin >> _; _; _--) solve();
}

C. Workout

题目链接

题意

给定 \(N\) 个严格递增的数,往这 \(N\) 个数中间插 \(K\) 个数,插入后要使所有的数仍然保持严格递增,而且要保证相邻两数的最大绝对值之差最小,求最小的绝对值之差。

思路

想了挺久的,最后二分过的,典型的最大值最小的问题。判断函数的思路:传入参数 \(x\),表示答案为 \(x\),然后遍历每个数 \(num[i]\),如果 \(num[i+1]−num[i]>x\),就插入 \(num[i]+x\),如果插入的数的个数大于 \(K\) 个就返回 false,否则返回 true。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
int _, Case;
int n, k;
ll tmp[N], a[N];
bool check(int x) {
int cnt = 0;
for (int i = 0; i < n - 1; ++i)
while (tmp[i + 1] - tmp[i] > x) tmp[i] += x, cnt++;
if (cnt > k) return false;
return true;
}
void solve() {
cin >> n >> k;
for (int i = 0; i < n; ++i) cin >> a[i];
cout << "Case #" << ++Case << ": ";
int l = 1, r = inf;
while (l < r) {
int mid = (l + r) >> 1;
for (int i = 0; i < n; ++i) tmp[i] = a[i];
if (check(mid))
r = mid;
else
l = mid + 1;
}
cout << r << endl;
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
for (cin >> _; _; _--) solve();
}

D. Bundling

题目链接

题意

给定 \(N\) 个字符串,把它们分组,每组 \(K\) 个。每组的分数是该组所有字符串的最长公共前缀。求最大的所有组的分数和。

思路

很容易想到前缀树 (字典树 / trie 树,相关算法讲解),建完树后从根节点 dfs,同时记录深度 d,然后从叶子节点回溯,统计每个节点出现的个数 cnt,如果某个节点 \(u\) 的 \(cnt[u]≥K\),那么说明有 K 个字符串的前缀是以该节点结尾,深度 d 表示它们的前缀的长度,由于是从叶子节点回溯的,所以一定是最长公共前缀,所以 \(ans=ans+d\),同时 \(cnt[u]\) 减去 \(k\),即这 \(k\) 个字符串已经分完组,不再分到其他组。

代码

#include <bits/stdc++.h>
#define ms(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10; int trie[N << 2][30], tot = 1;
int cnt[N << 2], n, k, _, Case;
ll ans;
string s; void init() { ms(trie, 0), ms(cnt, 0), tot = 1, ans = 0; }
void insert(string s) {
int p = 0;
for (auto c : s) {
int idx = c - 'A';
if (!trie[p][idx]) trie[p][idx] = tot++;
p = trie[p][idx];
}
++cnt[p];
}
void dfs(int u, int d) { //起点,深度
for (int v = 0; v < 26; ++v) {
if (trie[u][v]) {
dfs(trie[u][v], d + 1);
cnt[u] += cnt[trie[u][v]];
}
}
ans += cnt[u] / k * d, cnt[u] %= k;
}
void solve() {
init();
cout << "Case #" << ++Case << ": ";
cin >> n >> k;
for (int i = 0; i < n; ++i) cin >> s, insert(s);
dfs(0, 0);
cout << ans << endl;
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
for (cin >> _; _; _--) solve();
}

这是第一次做Google平台的比赛,感觉难易度适中(适合我这种蒟蒻,感觉以后可以多写写)

Goolge Kick Start Round A 2020 (A ~ D题题解)的更多相关文章

  1. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  2. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

  3. Codeforces Round #573 (Div. 2) D题题解

    一.题目 ​ Tokitsukaze, CSL and Stone Game ​ Tokitsukaze和CSL正在玩一些石头游戏. ​ 一开始,有n堆的石头,第i堆石头数记为 \(a_i\),两人轮 ...

  4. Codeforces Round #744 (Div. 3) G题题解

    淦,最后一道题没写出来,...还是我太菜了,不过这个题确实比较有趣. G. Minimal Coverage 简化题意:就是你处在坐标轴的0点上,给你一个序列\(a_i\),每次你可以选择向左走\(a ...

  5. Codeforces Round #741 (Div. 2)部分题题解

    我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...

  6. Google Kick Start Round G 2019

    Google Kick Start Round G 2019 Book Reading 暴力,没啥好说的 #include<bits/stdc++.h> using namespace s ...

  7. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  9. Educational Codeforces Round 65 (Rated for Div. 2)题解

    Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...

  10. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

随机推荐

  1. vue禁止浏览器F5进行刷新和监听浏览器刷新事件

    项目中有个这样的需求: 进入视频播放页后,添加一个标识,为了防止用户一次播放多个视频,当离开该页面后,如果是从当前正在播放的视频页面离开的,则离开播放页时清除标识,如果是不是则不清除,并且禁止用户按F ...

  2. 【Android】使用litepal实现数据库的创建和升级

    1.配置litepal 配置过程见:2.进行创建和升级数据库,可以省略sql语句的录入 定义一个Note类,代码如下 接下来将note类添加到映射模型列表当中,修改litepal.xml中的代码.如下 ...

  3. Excel表格存在不同大小的合并单元格怎么排序?

    当Excel表格中存在不同大小的合并单元格时,进行排序可能会出现一些难题.因为合并单元格会影响数据的布局,导致排序结果不符合预期. 下面我将详细介绍如何在包含不同大小合并单元格的Excel表格中进行排 ...

  4. 如何自学 PS、PR 等软件?

    学习Photoshop(PS)和Premiere Pro(PR)等软件需要一定的时间和耐心,以下是非常详细的自学指南. 第一部分:规划学习路线 1. 确定学习目标 在自学PS和PR之前,首先要明确自己 ...

  5. Echarts图表基本参数设置说明

    ECharts 是一款强大的数据可视化库,可以通过 JavaScript 构建交互式和动态的图表.在使用 ECharts 进行图表绘制时,我们可以通过设置各种参数来达到我们想要的效果.下面是对 ECh ...

  6. OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件🎈

    你好,我是 Kagol. 非常高兴跟大家宣布,2023年11月30日,OpenTiny Vue 发布了 v3.12.0 . OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,10.24 ...

  7. [ABC261Ex] Game on Graph

    Problem Statement We have a directed graph with \(N\) vertices and \(M\) edges. Edge \(i\) is direct ...

  8. [python]数据分析--数据清洗处理case1

    数据预处理案例1 主要涉及pandas读取csv文件,缺失值和重复值处理,分组计数,字段类型转换 ,结果写入到Excel. 根据要求对CSV数据集进行处理要求如下: 保留数据关键信息:time.lat ...

  9. 重磅:谷歌发布最强大AI模型【Google Gemini】

    一.前言 北京时间 2023年12 月 13 日Google 发布了最新的 Gemini Pro模型,并且提供了 API 访问. 一个更好的消息是:Gemini Pro 可免费使用.赶紧体验起来吧~ ...

  10. 如何 使 Java、C# md5 加密的值保持一致

    Java C# md5 加密值保持一致,一般是编码不一致造成的值不同 JAVA (加密:123456) C#(加密:123456) UTF-8 e10adc3949ba59abbe56e057f20f ...