2023牛客寒假算法基础集训营1(10/13)
admin
2024-05-13 00:25:30
0

World Final? World Cup! (I)

后面不用踢当且仅当即便后面全进,也赶不上另一方,注意还能踢几次球的计算

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while (T--) {string s;cin >> s;int len = s.size();int cnt1 = 0, cnt2 = 0, ans = -1;for (int i = 0; i < len; i++) {if (i & 1) {if (s[i] == '1') {cnt2++;}if (cnt1 > cnt2 + 5 - (i + 1) / 2 || cnt2 > cnt1 + 5 - (i + 1) / 2) {ans = i + 1;break;}} else {if (s[i] == '1') {cnt1++;}if (cnt1 > cnt2 + 5 - i / 2 || cnt2 > cnt1 + 4 - i / 2) {ans = i + 1;break;}}}cout << ans << '\n';}return 0;
}

现在是,学术时间 (I)

贪心地想,只要每个教授发表自己的,引用量大于等于1即可获得1点H指数,所以统计非正数即可

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while (T--) {int n;cin >> n;int ans = 0;vector a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i];if (a[i] > 0) {ans++;}}cout << ans << '\n';}return 0;
}

现在是,学术时间 (II)

根据数据范围发现,点一定都在第一象限内,所以讨论p点的相对位置即可

AC代码:

#include 
using namespace std;
using LL = long long;
struct point {long long x, y;point operator + (const point& p) {return {x + p.x, y + p.y};}point operator - (const point& p) {return {x - p.x, y - p.y};}double dot(const point& p) const {return 1.0 * x * p.x + 1.0 * y * p.y;}double cross(const point& p) const {return 1.0 * x * p.y - 1.0 * y * p.x;}double dist(const point& p) const {return sqrt(1.0 * (x - p.x) * (x - p.x) + 1.0 * (y - p.y) * (y - p.y));}
};
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while (T--) {point a, b, o;o.x = 0;o.y = 0;cin >> a.x >> a.y >> b.x >> b.y;point c, d;c.x = a.x;c.y = 0;d.y = a.y;d.x = 0;double ans;function calc = [&](point x, point y) {double res = 1.0 * abs(x.x - y.x) * abs(x.y - y.y);return res;};if (b.x >= a.x && b.y >= a.y) {ans = (1.0 * a.x * a.y) / (1.0 * b.x * b.y);} else if (b.x < a.x && b.y >= a.y) {ans = max((calc(b, o) - calc(b, d)) / (calc(b, d) + 1.0 * a.x * a.y), (calc(b, c) - calc(b, a)) / (calc(b, a) + 1.0 * a.x * a.y));} else if (b.x >= a.x && b.y < a.y) {ans = max((calc(b, d) - calc(b, a)) / (calc(b, a) + 1.0 * a.x * a.y), (calc(b, o) - calc(b, c)) / (calc(b, c) + 1.0 * a.x * a.y));} else {ans = max({calc(b, o), calc(b, a), calc(b, c), calc(b, d)}) / (1.0 * a.x * a.y);}cout << fixed << setprecision(10) << ans << '\n';}return 0;
}

鸡算几何

根据题意,判断有没有操作三,就判断铁丝是否发生了镜像的变化,因为铁丝是不会发生形变的,而且ABC和DEF不一定对应,就考虑叉积判断修改C和F是否都在AB和DE线段的逆时针方向,然后再判断此时AB和DE,BC和EF长度是否相等

AC代码:

#include 
using namespace std;
using LL = long long;
struct point {double x, y;point operator + (const point& p) {return {x + p.x, y + p.y};}point operator - (const point& p) {return {x - p.x, y - p.y};}double dot(const point& p) const {return 1.0 * x * p.x + 1.0 * y * p.y;}double cross(const point& p) const {return 1.0 * x * p.y - 1.0 * y * p.x;}double dist(const point& p) const {return sqrt(1.0 * (x - p.x) * (x - p.x) + 1.0 * (y - p.y) * (y - p.y));}
};
const double eps = 1e-8;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while (T--) {point a, b, c, d, e, f;cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;cin >> d.x >> d.y >> e.x >> e.y >> f.x >> f.y;point x, y, i, j;x.x = a.x - b.x;x.y = a.y - b.y;y.x = c.x - b.x;y.y = c.y - b.y;i.x = d.x - e.x;i.y = d.y - e.y;j.x = f.x - e.x;j.y = f.y - e.y;if (x.cross(y) < 0) {point z = a;a = c;c = z;}if (i.cross(j) < 0) {point z = d;d = f;f = z;}x.x = a.x - b.x;x.y = a.y - b.y;y.x = c.x - b.x;y.y = c.y - b.y;i.x = d.x - e.x;i.y = d.y - e.y;j.x = f.x - e.x;j.y = f.y - e.y;if (sqrt(x.dot(x)) - sqrt(i.dot(i)) > eps || sqrt(y.dot(y)) - sqrt(j.dot(j)) > eps) {cout << "YES\n";} else {cout << "NO\n";}}return 0;
}

鸡玩炸蛋人

因为图是无向图,所以先考虑没有一个炸弹的情况时,在一个联通块里的方案数是联通块大小的平方,那么答案就是所有联通块大小平方的和,如果一个联通块里存在炸弹,那么答案为存在炸弹的联通块大小的平方,如果多个联通块存在炸弹,无解

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;vector> G(n + 1);for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}int root = -1;vector c(n + 1);vector vis(n + 1);for (int i = 1; i <= n; i++) {cin >> c[i];if (c[i] > 0) {root = i;}}int sz = 0;function dfs = [&](int u) {for (auto v : G[u]) {if (!vis[v]) {vis[v] = true;sz++;dfs(v);}}};LL ans = 0;if (root == -1) {for (int i = 1; i <= n; i++) {if (!vis[i]) {vis[i] = true;sz = 1;dfs(i);ans = ans + 1LL * sz * sz;}}} else {vis[root] = true;sz = 1;dfs(root);for (int i = 1; i <= n; i++) {if (c[i] > 0 && !vis[i]) {cout << "0\n";return 0;}}ans = ans + 1LL * sz * sz;}cout << ans << '\n';return 0;
}

鸡格线

通过暴力跑f(x)=round(10*sqrt(x))发现,0无论跑多少次都是0,[1,99]跑有限次就达到99不再变化,[100,∞]也是跑有限次达到100后就不再变化,所以只需要存储下来非0的下标,以及多少次操作后就不再变化的操作数,操作时只修改还会变化的,否则从数组中删去,并修改所有数的和

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;vector a(n + 1), b, c;vector vis(n + 1);LL sum = 0;for (int i = 1; i <= n; i++) {cin >> a[i];int x = a[i];int cnt = 0;if (x >= 100) {while (x != 100) {x = round(10 * sqrt(x));cnt++;}b.push_back(i);c.push_back(cnt);} else if (x > 0) {while (x != 99) {x = round(10 * sqrt(x));cnt++;}b.push_back(i);c.push_back(cnt);}sum += a[i];}while (m--) {int op;cin >> op;if (op == 2) {cout << sum << '\n';} else {int l, r, k;cin >> l >> r >> k;int p = lower_bound(b.begin(), b.end(), l) - b.begin();int q = upper_bound(b.begin(), b.end(), r) - b.begin();int len = b.size();if (len == 0) {continue;}if (p == q) {continue;} else {vector z;for (int i = p; i < q; i++) {c[i] -= k;if (c[i] <= 0) {z.push_back(i);if (a[b[i]] >= 100) {sum -= a[b[i]];sum += 100;} else {sum -= a[b[i]];sum += 99;}} else {sum -= a[b[i]];for (int j = 0; j < k; j++) {a[b[i]] = round(10 * sqrt(a[b[i]]));}sum += a[b[i]];}}int len1 = z.size();int cnt = 0;for (int i = 0; i < len1; i++) {b.erase(z[i] + b.begin() - cnt);c.erase(z[i] + c.begin() - cnt);cnt++;}}}}return 0;
}

本题主要考察了DFS

因为这张图是完整的,所以考虑一个边有多少个凸出来的以及需要有多少凹进去的与他对应,没有恰好相等的,一定需要最后一块拼图给补上缺口

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while (T--) {int n;cin >> n;n *= n;vector a(n);vector cnt1(4), cnt2(4);for (int i = 1; i < n; i++) {cin >> a[i];for (int j = 0; j < 4; j++) {if (a[i][j] == '1') {cnt1[j]++;} else if (a[i][j] == '2') {cnt2[j]++;}}}int ans = 10;for (int i = 0; i < 4; i++) {if (cnt1[i] == cnt2[(i + 2) % 4]) {} else {if (cnt1[i] > cnt2[(i + 2) % 4]) {ans++;} else {ans--;}}}cout << ans << '\n';}return 0;
}

本题主要考察了dp

贪心地考虑,类似于100100100...1111放置,这样一定能保证坏区间是最小的

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;string s = "";for (int i = 1; i <= n; i++) {if (n - i >= m) {if (i % 3 == 1) {s += '1';m--;} else {s += '0';}} else {while (m) {s += '1';m--;}break;}}int ans = 0;for (int i = 0; i < n - 2; i++) {int cnt = (s[i] == '1' ? 1 : 0) + (s[i + 1] == '1' ? 1 : 0) + (s[i + 2] == '1' ? 1 : 0);if (cnt >= 2) {ans++;}}cout << ans << '\n';return 0;
}

本题主要考察了运气

因为问团队和问第几个人相对独立,所以分别考虑他们两个各自期望操作数是多少

问团队:一次问出,两次问出,三次问出,四次问出,四次问出,最多需要四次就能判断出,那么期望就是(1+2+3+4+4)/5

问第几个人:一次问出,两次问出,三次问出,三次问出,最多需要三次就能判断出,那么期望就是(1+2+3+3)/4

两者加起来2.8+2.25=4.05,答案为32

AC代码:

32

本题主要考察了找规律

01背包,n个人背包容量为m,dp[i][j]就可以表示为前i个人占用j个空间时最大价值,因为题目没有给出物品体积,即每次需要枚举[0,m]所有体积,如果不选dp[i][j]=dp[i-1][j],如果选,首先占用的空间不能超过背包目前占用空间j,并且此时手里有的仙贝数要大于0,此时(这次还没分配)手里的仙贝数就是(m-j+所选物品的体积),所以产生的价值就是 所选物品体积/此时(这次还没分配)手里的仙贝数

AC代码:

#include 
using namespace std;
using LL = long long;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;vector> dp(n + 1, vector (m + 1));for (int i = 1; i <= n; i++) {for (int j = 0; j <= m; j++) {dp[i][j] = dp[i - 1][j];for (int k = 0; k <= m; k++) {if (j >= k && m - j + k > 0) {dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + 1.0 * k / (m - j + k));}}}}double ans = 0.0;for (int i = 0; i <= m; i++) {ans = max(ans, dp[n][i]);}cout << fixed << setprecision(10) << ans << '\n';return 0;
}

相关内容

热门资讯

体重管理 | 零卡蘸料,让健康... 传统的调味品如高脂肪沙拉酱、蛋黄酱或浓郁的炒菜酱汁,通常含有大量的油脂、糖分,是膳食中隐藏的热量来源...
任泽平力挺追觅俞浩:寻找中国的... 来源:5D调查 2月11日,经济学家任泽平转发追觅科技创始人俞浩的博文称:这个时代需要一批仰望星空的...
20300元/㎡!攀成钢18亩... 十年未供应住宅用地的成都攀成钢板块,终于“上新”了! 2月10日,成都春节前最后一场土拍落槌,锦江区...
原创 海... 2026年2月8日,Neutrality Studies嘉宾埃纳尔·坦根(Einar Tangen)...
冰箱里的年货,别连塑料袋放!小... 小年到,年味浓! 今天(2月10日)是北方小年 明天则是南方小年 无论南北 小年都奏响了春节的序曲 ...
原创 巴... 日本股市再创历史新高,日经225指数今年以来累计上涨接近15%。前些年,巴菲特开始大手笔投资日本五大...
八马茶叶“高端茶第一股”的幻灭... 加盟红利消退,高端叙事承压。 文/每日财报 南黎 头顶 “高端中国茶第一股” 光环的八马茶业在港交...
保险行业如何在小红书精准吸引客... 做保险的宝子们,有没有被小红书获客搞疯过?明明每天熬夜写笔记、发科普,小眼睛却常年停留在100+,要...
午报三大指数震荡整理涨跌不一,... 一、【早盘盘面回顾】 财联社2月11日讯,三大指数涨跌不一,沪指震荡拉升,创业板指走势较弱。沪深两市...
音乐圈的第一批AI受害者出现了 文|音乐先声 当AI音乐时代来临,最先倒下的是他们。 1月28日,全球音乐制作大厂Native I...
宝宝走路经常摔跤,超过这个年纪... 宝宝走路经常摔跤,通常有以下 2 种情况: 如果宝宝正是 1 岁左右开始蹒跚学步的年龄,走起路来摇摇...
春节AI红包大战,算力届春晚才... 今年春节被大模型红包承包了:腾讯元宝10亿、百度文心一言5亿、阿里千问亿元冠名,而真正的产业福利藏在...
固态电池概念拉升,电池ETF嘉... 截至2月11日10点55分,上证指数涨0.29%,深证成指涨0.09%,创业板指跌0.57%。小金属...
原创 I... 作者:阿飞 在传统2C电商增长放缓的当下,电商巨头们开始将目光放到小众的工业MRO领域。 2025...
新巨丰并表纷美包装,净利润反降... 图片来源:界面图库 界面新闻记者 | 牛其昌 三年前,作为中国无菌包装市场份额排名前二的本土企...
需求承压,可口可乐预计温和增长 来源:环球市场播报 核心要点 可口可乐预计 2026 年有机收入增长 4%~5%。 与竞争对手...
所谓“现货订购”,实为虚假盘?...   锦礼订购APP上“银锤纹茶壶”“手工紫铜壶”“锌合金茶漏”“铂金一号茶杯碟”等商品现货订购持续亏...
永辉超市CEO发全员信,202... 今日(2月11日),永辉超市CEO王守诚通过新年全员信,系统阐述了公司战略转型的阶段性成果与2026...
“2025年度十大影响力经济学... 来源:金融一线 2025年,中国经济在内外多重挑战下稳步回升、提质向好,宏观政策精准协同、提质增效,...
零碳工厂政策催化,碳中和ETF... 截至2月11日10点30分,上证指数涨0.11%,深证成指涨0.01%,创业板指跌0.62%。小金属...