Codeforces Round #792 (Div. 1 + Div. 2)解題報告
阿新 • • 發佈:2022-05-22
A. Digit Minimization
題意:對一個數字串輪流進行如下操作:
1.任選兩個不同位置的數字交換
2.刪除最後一個數字
問最後剩下的最小的數字是多少
分析:貪心,最後剩下的數一定是第一個位置上的數,那麼一開始就把最小的數字放第一位即可,特判數字串長度為2的情況
ac程式碼
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int t,n,m,x,y,k; int a[N]; string s; int main() { ios; cin >> t; while(t --) { cin >> s; if(s.size() == 2) cout << s[1] << endl; else { int ans = INF; for(auto i : s) { ans = min(ans,int(i - '0')); } cout << ans << endl; } } return 0; }
B. Z mod X = C
題意:給定三個數字a,b,c
問滿足下列情況的三個數字:
\(xmody=a\),
\(ymodz=b\),
\(zmodx=c\).
分析:直接構造
ac程式碼
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int t,n,m,x,y,k; int a[N]; string s; int main() { ios; cin >> t; while(t --) { int a,b,c; cin >> a >> b >> c; cout << a + b + c << ' ' << b + c << ' ' << c << endl; } return 0; }
C. Column Swapping
題意:給定一個矩陣,問是否能通過交換兩列一次的操作,使每行都是非遞減序列。
模擬
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int n,m,k,x,y; void solve(vector<vector<int>> & a) { vector<int> need; for(int i = 0;i < n && need.empty();i ++) { vector<int> b = a[i]; sort(b.begin(),b.end()); for(int j = 0;j < m;j ++) { if(a[i][j] != b[j]) need.pb(j); } } if((int)need.size() > 2) { cout << -1 << endl; return ; } if((int)need.size() == 0) { cout << 1 << ' ' << 1 << endl; return ; } for(int i = 0;i < n;i ++) swap(a[i][need[0]],a[i][need[1]]); for(int i = 0;i < n;i ++) for(int j = 1;j < m;j ++) if(a[i][j - 1] > a[i][j] ) { cout << -1 << endl; return ; } cout << need[0] + 1 << ' ' << need[1] + 1 << endl; return; } int main() { ios; int t; cin >> t; while(t --) { cin >> n >> m; vector<vector<int>> a(n, vector<int>(m)); for(int i = 0;i < n;i ++) for(int j = 0;j < m;j ++) cin >> a[i][j]; solve(a); } return 0; }
D. Traps
題意:有一排陷阱,必須按順序踩過去,可以選擇k個跳過去,但每次跳躍都會使後面的每個陷阱傷害加一,問最小的傷害數。
分析:
考慮每次跳躍對傷害的貢獻:
第一次:n - i + k - 1;
第二次:n - i + k - 2;
第三次:n - i + k - 3;
...
所以跳躍對傷害的總貢獻 : \(\sum_{i = 1} ^ k n - pi + k - i = k * n - \sum_{i = 1} ^ k pi + k * k / 2\)
所以所受傷害:$\sum_{i = 1} ^ n ai + k * n - \sum_{i = 1} ^ k pi + k * k / 2 - ? $
其中的 ? 就是跳過去的原始傷害,貪心的想,令其最大
ac程式碼
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include <sstream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <unordered_map>
#define x first
#define y second
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n'
#define pb push_back
#define pi 3.14159265358979323846
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ;
const double INFF = 0x7f7f7f7f7f7f7f7f;
int n,m,k,x,y;
int a[N];
int main()
{
ios;
int t;
cin >> t;
while(t --)
{
priority_queue<PII> h;
cin >> n >> k;
for(int i = 0;i < n;i ++) cin >> a[i],h.push({a[i] + i,i});
vector<bool> st(n, false);
for(int i = 0;i < k;i ++)
{
auto t = h.top();
h.pop();
st[t.second] = true;
}
LL ans = 0,t = 0;
for(int i = 0;i < n;i ++)
{
if(st[i]) t++;
else ans += t + a[i];
}
cout << ans << endl;
}
return 0;
}