AtCoder Beginner Contest 388
A - A - ?UPC#
题意#
给定字符串
,输出 首个字符与 组成的字符串
思路#
模拟
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
string s;
cin >> s;
cout << s[0] << "UPC" << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - Heavy Snake#
题意#
有
条蛇,最初第 条蛇的长度为 、厚度为 。定义第 条蛇的重量为 。对于满足 的每个整数 ,求每条蛇的长度增加 时最重的蛇的重量
思路#
自定义排序
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
bool cmp(pii& a, pii& b)
{
return a.first * a.second > b.first * b.second;
}
void solve()
{
int n, k;
cin >> n >> k;
vector<pii> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i].first >> v[i].second;
}
for (int i = 1; i <= k; i++)
{
for (int j = 0; j < n; j++)
{
v[j].second++;
}
sort(v.begin(), v.end(), cmp);
cout << v[0].first * v[0].second << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
C - Various Kagamimochi#
题意#
个年糕,第 个年糕大小为 ,按升序输入。对于两个年糕 ,当且仅当 时可以将 叠在 上组成一个年糕。问两两叠加一共能组成多少不同的年糕
思路#
由于是升序输入,对于每个年糕,只需要二分找第一个不小于自己大小两倍的年糕的位置累加即可。
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
int ans = 0;
for (int i = 0; i < n; i++)
{
auto p = lower_bound(v.begin(), v.end(), 2 * v[i]);
if (p != v.end())
{
ans += n - (p - v.begin());
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
D - Coming of Age Celebration#
题意#
有
个未成年人,第 个人有 个宝石,并在第 年成年。当有人成年时,有宝石的成年人会每人会给刚成年的人 个宝石。求 年后每人各有多少宝石。
思路#
"在第
年成年"就只用按编号往后推,第 成年时前 个人都要给他石头(如果有的话);第 个人要给后 每人一个石头
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lc p << 1
#define rc p << 1 | 1
const int mxn = 5e5 + 5;
int n;
int t[mxn];
struct tree
{
int l, r, sum, lazy;
}tr[4 * mxn];
int a[mxn];
inline void pushup(int p)
{
tr[p].sum = tr[lc].sum + tr[rc].sum;
}
void pushdown(int p)
{
tr[lc].sum += tr[p].lazy * (tr[lc].r - tr[lc].l + 1);
tr[lc].lazy += tr[p].lazy;
tr[rc].sum += tr[p].lazy * (tr[rc].r - tr[rc].l + 1);
tr[rc].lazy += tr[p].lazy;
tr[p].lazy = 0;
}
void build(int p, int l, int r)
{
tr[p].l = l;
tr[p].r = r;
tr[p].lazy = 0;
if (l == r)
{
tr[p].sum = a[l];
return;
}
int mid = l + r >> 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(p);
}
void update(int p, int l, int r, int k)
{
if (tr[p].l >= l && tr[p].r <= r) // 查询区间覆盖当前区间
{
tr[p].sum += (tr[p].r - tr[p].l + 1) * k;
tr[p].lazy += k;
return;
}
int mid = tr[p].l + tr[p].r >> 1;
pushdown(p);
if (l <= mid)
{
update(lc, l, r, k);
}
if (r > mid)
{
update(rc, l, r, k);
}
pushup(p);
}
int query(int p, int l, int r)
{
if (tr[p].l >= l && tr[p].r <= r) // 查询区间覆盖当前区间
{
return tr[p].sum;
}
int mid = tr[p].l + tr[p].r >> 1;
pushdown(p);
int res = 0;
// 有交集
if (l <= mid)
{
res += query(lc, l, r);
}
if (r > mid)
{
res += query(rc, l, r);
}
return res;
}
void solve()
{
cin >> n;
vector<int> v(n + 1);
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
build(1, 1, n);
for (int i = 1; i <= n; i++)
{
int t = query(1, i, i); // 自己收到的
// 给后面的发,直到没有
update(1, i + 1, min(i + v[i] + t, n), 1);
v[i] = max(0LL, v[i] + t - n + i);
}
for (int i = 1; i <= n; i++)
{
cout << v[i] << " ";
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
E - Simultaneous Kagamimochi#
题意#
同
,最后求最多同时能制作多少年糕
思路#
像
一样二分选尽量小的根自己组合 了很多点,应该不能这么做。
考虑二分答案,最少个,最多 个,选择最前与最后的区间配对(小对小,大对大)。
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 5e5 + 5;
int n;
int a[mxn];
bool check(int x)
{
for (int i = 0; i < x; i++)
{
if (a[i] * 2 > a[n - x + i])
{
return false;
}
}
return true;
}
void solve()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int l = 0, r = n / 2, ans = 0;
while (l <= r)
{
int mid = l + r >> 1;
if (check(mid))
{
l = mid + 1;
ans = mid;
}
else
{
r = mid - 1;
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】