AtCoder Beginner Contest 252 A - F 題解
阿新 • • 發佈:2022-05-24
A - ASCII code
輸出
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #include <queue> #include <functional> #include <map> #include <set> #include <cmath> #include <cstring> #include <deque> #include <stack> using namespace std; typedef long long ll; #define pii pair<int, int> const ll maxn = 2e5 + 10; const ll inf = 1e17 + 10; int main() { int x; cin >> x; cout << (char)x << endl; return 0; }
B - Takahashi's Failure
找最大值,然後找是否有討厭的
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #include <queue> #include <functional> #include <map> #include <set> #include <cmath> #include <cstring> #include <deque> #include <stack> using namespace std; typedef long long ll; #define pii pair<int, int> const ll maxn = 2e5 + 10; const ll inf = 1e17 + 10; int vis[maxn], num[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; for(int i=1; i<=n; i++) cin >> num[i]; for(int i=0; i<m; i++) { int x; cin >> x; vis[x] = 1; } int maxx = num[1]; for(int i=1; i<=n; i++) maxx = max(maxx, num[i]); int f = 0; for(int i=1; i<=n; i++) { if(vis[i] == 1 && num[i] == maxx) f = 1; } if(f) cout << "Yes" << endl; else cout << "No" << endl; return 0; }
C - Slot Strategy
題意羅裡吧嗦的
以數字 0-9
列舉,判斷一下所在位置(對應需要的時間),如果對應時間出現了多次,得相應地補若干個 10 秒,維護最大值,找最大值的最小值就好
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <string> #include <queue> #include <functional> #include <map> #include <set> #include <cmath> #include <cstring> #include <deque> #include <stack> using namespace std; typedef long long ll; #define pii pair<int, int> const ll maxn = 2e5 + 10; const ll inf = 1e17 + 10; int alp[110][300]; int vis[20]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; for(int i=0; i<n; i++) { string s; cin >> s; for(int j=0; j<10; j++) { alp[i][s[j]] = j; } } int ans = n * 100; for(int i='0'; i<='9'; i++) { int x = 0; for(int j=0; j<20; j++) vis[j] = 0; for(int j=0; j<n; j++) { x = max(x, vis[alp[j][i]] * 10 + alp[j][i]); vis[alp[j][i]]++; } ans = min(ans, x); } cout << ans << endl; return 0; }
D - Distinct Trio
先處理兩個的,算出前 i 個兩兩不同組合起來有多少種
對於第 i + 1
個的三個數字組合,無非就加多一個數字,就判斷一下前面兩兩組合中,不包含當前數字的有多少種:可以維護一個 cnt 數字,代表 x 在前面出現了 cnt[x] 次,則 x 與剩下的兩兩組合,就有 (i - cnt[x]) * cnt[x]
種組合,減去這些就可以了
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
ll num[maxn], cnt[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i=1; i<=n; i++) cin >> num[i];
ll ans = 0, pre = num[1] != num[2];
cnt[num[1]]++;
cnt[num[2]]++;
for(int i=3; i<=n; i++)
{
ans += pre - cnt[num[i]] * (i - 1 - cnt[num[i]]);
pre += i - 1 - cnt[num[i]];
cnt[num[i]]++;
}
cout << ans << endl;
return 0;
}
E - Road Reduction
dijstra
要求 1 到其他結點的路徑和最短,說明是 1 到其他結點的最短路徑建樹
這麼一想就發現是迪傑斯特拉的方式構建樹
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
struct node
{
int u, v, id;
ll val;
node(int _u, int _v, ll _val, int _id){u = _u; v = _v; val = _val; id = _id;}
bool operator < (const node& a) const
{
return val > a.val;
}
};
vector<node>gra[maxn];
vector<int>ans;
int vis[maxn];
void dijstra(int n)
{
priority_queue<node>q;
q.push(node(1, 1, 0, 0));
while(q.size() && ans.size() < n)
{
node now = q.top();
q.pop();
if(vis[now.v]) continue;
vis[now.v] = 1;
ans.push_back(now.id);
for(int i=0; i<gra[now.v].size(); i++)
{
node nex = gra[now.v][i];
if(vis[nex.v]) continue;
q.push(node(now.v, nex.v, now.val + nex.val, nex.id));
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for(int i=1; i<=m; i++)
{
int x, y, z;
cin >> x >> y >> z;
gra[x].push_back(node(x, y, z, i));
gra[y].push_back(node(y, x, z, i));
}
dijstra(n);
for(int i=1; i<ans.size(); i++)
{
if(i != 1) cout << " ";
cout << ans[i];
}
cout << endl;
return 0;
}
F - Bread
哈夫曼編碼
考慮反向合成上去,就會發現是哈夫曼編碼的方式構造
因為最後砍完之後還可能剩下一段是沒人要的,我們把這一段也視為是需要的,加入起始中去通過哈夫曼編碼合成
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
const ll maxn = 2e5 + 10;
const ll inf = 1e17 + 10;
ll cnt[maxn], num[maxn];
ll a[maxn], b[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
ll l;
cin >> n >> l;
priority_queue<ll>q;
ll sum = 0;
for(int i=0; i<n; i++)
{
ll x;
cin >> x;
q.push(-x);
sum += x;
}
if(l - sum) q.push(sum - l);
ll ans = 0;
while(q.size() > 1)
{
ll a = -q.top();
q.pop();
ll b = -q.top();
q.pop();
ans += a + b;
q.push(-(a + b));
}
cout << ans << endl;
return 0;
}