1. 程式人生 > 實用技巧 >【題解】 Codeforces Round #661 (Div. 3)

【題解】 Codeforces Round #661 (Div. 3)

當你心情不好的時候 \(\textrm{vp}\) 一場 \(\textrm{div3}\) 就好了。

Link \(\textrm{to Codeforces}\)

A. Remove Smallest

Legend

給定長 \(n\ (1 \le n \le 50)\) 的陣列 \(a\ (1 \le a_i \le 100)\),你每次可以選兩個差的絕對值不超過 \(1\) 的兩個數出來,並丟掉一個,放回去一個。問是否能最後讓陣列只剩一個元素?

資料組數 \(1 \le t\le 1000\)

Editorial

排序後判斷相鄰的數字是否相差不超過 \(1\)

Code

void solve(){
	int n; cin >> n;
	for(int i = 1 ; i <= n ; ++i) cin >> a[i];
	std::sort(a + 1 ,a + 1 + n);
	for(int i = 2 ; i <= n ; ++i){
		if(a[i] - a[i - 1] > 1){
			puts("NO");
			return;
		}
	}
	puts("YES");
}

B. Gifts Fixing

Legend

給定長度為 \(n\ (1 \le n \le 50)\) 的陣列 \(a,b\ (1 \le a_i,b_i \le 10^9)\),你每次可以做以下操作之一:

  • \(a_i \gets a_i - 1\)
  • \(b_i \gets b_i - 1\)
  • \(a_i \gets a_i - 1\)\(b_i \gets b_i - 1\)

\(a_i,b_i\) 不能變為負數。請問使得 \(a\) 中每個數都相等且 \(b\) 中每個數都相等的最少操作次數。

資料組數 \(1 \le t\le 1000\)

Editorial

顯然要把 \(a\) 裡的數全變成 \(\min a_i\)

,把 \(b\) 裡的數全變成 \(\min b_i\)。然後對於每一個下標都先貪心地兩個一起減,然後再單獨減。

Code

void solve(){
	int n; cin >> n;
	int mna = 1e9 ,mnb = 1e9;
	for(int i = 1 ; i <= n ; ++i){
		cin >> a[i];
		mna = min(mna ,a[i]);
	}
	for(int i = 1 ; i <= n ; ++i){
		cin >> b[i];
		mnb = min(mnb ,b[i]);
	}
	long long Ans = 0;
	for(int i = 1 ; i <= n ; ++i){
		int common = min(a[i] - mna ,b[i] - mnb);
		Ans += a[i] + b[i] - mna - mnb - common;
	}
	printf("%lld\n" ,Ans);
}

C. Boats Competition

Legend

給定長度為 \(n\ (1 \le n \le 50)\) 的陣列 \(a,b\ (1 \le a_i,b_i \le n)\),你每次可以做以下操作之一: