1. 程式人生 > 其它 >Codeforces Round #744 (Div. 3) 題解

Codeforces Round #744 (Div. 3) 題解

A. Casimir's String Solitaire

思路

因為只能同時擦去 A B,或 B C,所以只有在 A 的數量加 C 的數量等於 B 的數量時,才能完全擦除。

程式碼

#include <bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define I inline
#define ll long long
#define Con const
#define CI Con int
#define RI register int
#define W while
#define gc getchar
#define D isdigit(c=gc())
#define pc(c) putchar((c))
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x=(y)))
#define Gmin(x,y) (x>(y)&&(x=(y)))
#define ms(a,x) memset((a),(x),sizeof(a))
using namespace std;
namespace FastIO
{
	CI FS = 1e5; int Top = 0; char S[FS];
	I void readc (char& c) {W (isspace (c = gc ()));}
	Tp I void read (Ty& x) {char c; int f = 1; x = 0; W (! D) f = c ^ '-' ? 1 : -1; W (x = (x * 10) + (c ^ 48), D); x *= f;}
	Ts I void read (Ty& x, Ar&... y) {read (x); read (y...);}
	Tp I void write (Ty x) {x < 0 && (pc ('-'), x = -x, 0); W (S[++ Top] = x % 10 + '0', x /= 10); W (Top) pc (S[Top --]);}
	Tp I void writeln (Ty x) {write (x); pc ('\n');}
} using namespace FastIO;
int T; int n; 
int main () {
	RI i, j; read (T); W (T --) {
		int sum1 = 0, sum2 = 0;
		string s;
		getline (cin, s);
		for (RI i = 1; i <= s.length (); ++ i) {
			if (s[i - 1] == 'A' || s[i - 1] == 'C') ++ sum1;
			else ++ sum2;
		}
		if (sum1 == sum2) printf ("YES\n");
		else printf ("NO\n");
	}
	return 0;
}

B. Shifting Sort

思路

我們可以使用選擇排序的思想。依次從小到大找數,然後進行一次偏移操作,將數放在對應的地方。

124357,其中前兩個已經排好序。那麼我們先查詢第三大的數,此例為 3,發現 3 在第 4 個,而它應該在第 3 個。所以我們需要對 \([3,4]\) 執行一次 \(d = 1\) 的操作。

程式碼

#include <bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define I inline
#define ll long long
#define Con const
#define CI Con int
#define RI register int
#define W while
#define gc getchar
#define D isdigit(c=gc())
#define pc(c) putchar((c))
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x=(y)))
#define Gmin(x,y) (x>(y)&&(x=(y)))
#define ms(a,x) memset((a),(x),sizeof(a))
using namespace std;
namespace FastIO
{
	CI FS = 1e5; int Top = 0; char S[FS];
	I void readc (char& c) {W (isspace (c = gc ()));}
	Tp I void read (Ty& x) {char c; int f = 1; x = 0; W (! D) f = c ^ '-' ? 1 : -1; W (x = (x * 10) + (c ^ 48), D); x *= f;}
	Ts I void read (Ty& x, Ar&... y) {read (x); read (y...);}
	Tp I void write (Ty x) {x < 0 && (pc ('-'), x = -x, 0); W (S[++ Top] = x % 10 + '0', x /= 10); W (Top) pc (S[Top --]);}
	Tp I void writeln (Ty x) {write (x); pc ('\n');}
} using namespace FastIO;
CI N = 55; int a[N + 5], n, T, tot, ans[N][3]; 
void change (int l, int r, int d) {
	RI i, j; ++ tot; ans[tot][0] = l; ans[tot][1] = r; ans[tot][2] = d;
	int num[55]; for (i = l; i <= r; ++ i) num[i] = a[i];
	for (i = l; i <= r - d; ++ i) a[i] = num[i + d];
	for (i = r - d + 1, j = l; i <= r; ++ i, ++ j) a[i] = num[j];
}
int main () {
	RI i, j; read (T); W (T --) {
		read (n); for (i = 1; i <= n; ++ i) read (a[i]);
		tot = 0;
//		for (i = 1; i <= n; ++ i) sum[i] = a[i]; sort (sum + 1, sum + n + 1); int cnt = unique (sum + 1, sum + n + 1) - sum - 1;
//		for (i = 1; i <= n; ++ i) a[i] = lower_bound (sum + 1, sum + cnt + 1, a[i]) - sum;
		for (i = 1; i <= n; ++ i) {
			int id, minn = 0x7fffffff; for (j = i; j <= n; ++ j) if (a[j] < minn) minn = a[j], id = j;
			if (id - i != 0) change (i, id, id - i);
		}
		printf ("%d\n", tot); for (i = 1; i <= tot; ++ i) printf ("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
//		for (i = 1; i <= n; ++ i) printf ("%d ", a[i]); printf ("\n");
	}
	return 0;
}