C/C++教程

Codeforces Round #792 (Div. 1 + Div. 2)解题报告

本文主要是介绍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;
}
这篇关于Codeforces Round #792 (Div. 1 + Div. 2)解题报告的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!