AtCoder Beginner Contest 402 (Tokio Marine & Nichido Fire Insurance Programming Contest 2025)
A - CBC
题意
思路
模拟
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
string s;
cin >> s;
for (int i = 0; i < s.length(); i++)
{
if (isupper(s[i]))
{
cout << s[i];
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
B - Restaurant Queue
题意
思路
模拟
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
queue<int> q;
void solve()
{
int op;
cin >> op;
if (op == 1)
{
int x;
cin >> x;
q.push(x);
}
else
{
cout << q.front() << endl;
q.pop();
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
cin >> __;
while (__--)
{
solve();
}
return 0;
}
C - Dislike Foods
题意
思路
统计每道菜含有的不吃配料数量,遍历克服的配料,同时更新,为\(0\)就可以吃
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
int n, m;
cin >> n >> m;
vector<vector<int>> a(m), idx(n);
vector<int> cnt(m, 0);
for (int i = 0; i < m; i++)
{
int k;
cin >> k;
cnt[i] = k;
for (int j = 0; j < k; j++)
{
int x;
cin >> x;
x--;
idx[x].push_back(i);
}
}
int ans = 0;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
x--;
for (int j = 0; j < idx[x].size(); j++)
{
cnt[idx[x][j]]--;
if (!cnt[idx[x][j]]) ans++;
}
cout << ans << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
D - Line Crossing
题意
思路
\(a_i+b_i\ mod\ n\)相同的直线平行,统计平行的对数用总数减去即可
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
int n, m;
cin >> n >> m;
vector<int> cnt(n, 0);
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
cnt[(a + b) % n]++;
}
int ans = m * (m - 1) >> 1;
for (auto& i : cnt)
{
ans -= i * (i - 1) >> 1;
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
E - Payment Required
题意
思路
用 \(n\) 位二进制串\(j\)表示过题的状态(\(1\)过\(0\)不过),则总的状态就是\([0, 1 << n]\),对于每个状态,我们枚举此时过掉的题目 \(k\),当\(j\)的第\(k\)位是\(1\)时才表示这题在这次提交中通过,用 \(f_{i,j}\) 表示花费了\(i\)通过了状态为\(j\)的题目的最大期望,则此时的期望为 \(f_{i,j} =\ max\{\ f_{i,j},\ \frac {P_k} {100}\ (f_{i-c_k,\ j\ \oplus{(1<<k)}} + s_k) + \frac {100 - P_k} {100}\ f_{i-c_k,\ j}\}\)
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define int long long
#define endl '\n'
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
int n, x;
cin >> n >> x;
vector<int> s(n), c(n), p(n);
for (int i = 0; i < n; i++)
{
cin >> s[i] >> c[i] >> p[i];
}
vector<vector<double>> f(x + 1, vector<double>((1LL << n) + 5, 0.0));
double ans = 0.0;
for (int i = 0; i <= x; i++)
{
for (int j = 0; j <= (1LL << n); j++)
{
for (int k = 0; k < n; k++)
{
if ((j >> k) & 1 && c[k] <= i)
{
// f[i - c[k]][j & ~(1LL << k)] 表示第k题没通过时的最大期望
f[i][j] = max(f[i][j], p[k] / 100.0 * (f[i - c[k]][j & ~(1LL << k)] + s[k]) + (100.0 - p[k]) / 100.0 * f[i - c[k]][j]);
}
ans = max(ans, f[i][j]);
}
}
}
cout << fixed << setprecision(6) << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}