1. 程式人生 > 其它 >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;
}