AtCoder Beginner Contest 299 (Tokio Marine & Nichido Fire Insurance Programming Contest 2023)
A - Treasure Chest
题意
思路
模拟
代码
点击查看代码
#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 = 2e3 + 10;
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
int a = -1, b, c;
for (int i = 0; i < (int)s.size(); i++)
{
if (s[i] == '|')
{
if (a == -1)
{
a = i;
}
else
{
c = i;
}
}
else if (s[i] == '*')
{
b = i;
}
}
if (a < b && b < c)
{
cout << "in" << endl;
}
else
{
cout << "out" << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
B - Trick Taking
题意
思路
模拟
代码
点击查看代码
#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 = 2e3 + 10;
void solve()
{
int n, t;
cin >> n >> t;
vector<int> c(n), r(n);
unordered_set<int> s;
for (int i = 0; i < n; i++)
{
cin >> c[i];
s.insert(c[i]);
}
for (int i = 0; i < n; i++)
{
cin >> r[i];
}
int ans = 1, maxn = -1;
if (!s.count(t))
{
t = c[0];
}
for (int i = 0; i < n; i++)
{
if (c[i] == t && maxn < r[i])
{
maxn = r[i];
ans = i + 1;
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
C - Dango
题意
思路
模拟
代码
点击查看代码
#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 = 2e3 + 10;
void solve()
{
int n;
cin >> n;
string s;
cin >> s;
if (s.find("-") == s.npos || s.find("o") == s.npos)
{
cout << -1 << endl;
return;
}
int i = 0, j = 0, maxn = 0;
while (i < n && j < n)
{
if (s[i] == '-')
{
i++;
continue;
}
j = i;
while (s[j] == 'o')
{
j++;
}
maxn = max(maxn, j - i);
i = j;
}
cout << maxn << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
D - Find by Query
题意
思路
由于两端已知(左\(0\)右\(1\)),那只需要“二分”(\(1\)向左\(0\)向右),根据回答向一端逼近,题目保证有解,最后一定会到\(l\)与\(r\)相邻的情况
戳我看\(endl\)本质
代码
点击查看代码
#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;
cin >> n;
int l = 1, r = n;
for (int q = 0; q < 20; q++)
{
if (l + 1 == r)
{
cout << "! " << l << endl;
return;
}
int mid = l + r >> 1;
cout << "? " << mid << endl;
int c;
cin >> c;
if (c == 1)
{
r = mid;
}
else
{
l = mid;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
E - Nearest Black Vertex
题意
思路
对于第\(i\)个限制条件中的点 \(p_i\),与它距离小于 \(d_i\) 的点必须是白色;距离等于 \(d_i\) 的点中至少要有一个是黑色。没被涉及的点尽量初始化成黑色
代码
点击查看代码
#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>> g(n);
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
u--, v--;
g[u].push_back(v);
g[v].push_back(u);
}
vector<vector<int>> dis(n, vector<int>(m + 1, 1e18));
for (int i = 0; i < n; i++)
{
dis[i][i] = 0;
priority_queue<pii, vector<pii>, greater<pii>> q;
vector<bool> vis(n, false);
q.push(make_pair(dis[i][i], i));
while (q.size())
{
auto [w, u] = q.top();
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (auto& v : g[u])
{
if (dis[i][v] > dis[i][u] + 1)
{
dis[i][v] = dis[i][u] + 1;
q.push(make_pair(dis[i][v], v));
}
}
}
}
int k;
cin >> k;
vector<int> col(n, 1), p(k), d(k);
for (int i = 0; i < k; i++)
{
cin >> p[i] >> d[i];
p[i]--;
for (int j = 0; j < n; j++)
{
// 距离小于d[i]的只能是白色
if (dis[p[i]][j] < d[i])
{
col[j] = 0;
}
}
}
for (int i = 0; i < k; i++)
{
int u = p[i];
bool f = false;
for (int v = 0; v < n; v++)
{
// 距离恰为d[i]至少有一个黑色
if (dis[u][v] == d[i] && col[v] == 1)
{
f = true;
}
}
if (!f)
{
cout << "No" << endl;
return;
}
}
cout << "Yes" << endl;
for (int i = 0; i < n; i++)
{
cout << col[i];
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}






浙公网安备 33010602011771号