Codeforces Round #792 (Div. 1 + Div. 2)解题报告
作者:互联网
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;
}
标签:792,int,cout,ios,Codeforces,cin,Div,include,define 来源: https://www.cnblogs.com/notyour-young/p/16298978.html