ABC368

心向阳无畏伤發表於2024-08-29

A

link

先輸出後面,在輸出前面。

神奇的程式碼
#include<bits/stdc++.h>

using namespace std;

int n,k;
int a[105];

signed main(){
	
	cin >> n >> k;
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		if(i >= n-k+1) cout << a[i] << " ";
	}
	for(int i = 1;i < n-k+1;++ i) cout << a[i] << " ";
	
	return 0;
	
} 

B

link

模擬。

神奇的程式碼
#include<bits/stdc++.h>

using namespace std;

int n;
int a[105];

bool cmp(int x,int y){
	return x > y;
}

signed main(){
	
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i];
	
	int res = 0,op = 0;
	while(n-res > 1){
		sort(a+1,a+1+n,cmp);
		a[1]--;a[2]--;
		if(a[1] == 0) res++;
		if(a[2] == 0) res++;
		op++;
	}
	cout << op;
	
	return 0;
	
} 

C

link

對於每一個數,把\({1,1,2}\)作為一個選擇,看有幾個\(5\)\(t\)就加幾個\(3\),剩下的不夠\(5\)的暴力。

神奇的程式碼
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n;
int a[200005];

signed main(){
	
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i];
	
	int ti = 0;
	for(int i = 1;i <= n;++ i){
		int x = a[i];
		ti += x/5*3;
		x %= 5;
		while(x > 0){
			ti++;x--;
			if(ti%3 == 0) x -= 2;
		}
	}
	
	cout << ti;
	
	return 0;
	
} 

D

link

\(dfs\)。從一個點開始\(dfs\),如果子樹內有點選,這個點就必須選,每個\(dfs\)返回一下以這個為根的子樹有多少個點選。注意要從選的點開始\(dfs\)最優,因為如果從不選的,那麼就一定會選這個,因為一定有要選的在他的子樹內,就會多。

神奇的程式碼
#include<bits/stdc++.h>

using namespace std;

int k,n;
vector<int>ed[200005];
int v[200005];
int rt;

int dfs(int x,int fa){
	int res = 0;
	for(int i = 0;i < ed[x].size();++ i){
		int j = ed[x][i];
		if(j != fa) res += dfs(j,x);
	}
	if(res||v[x]) res++;
	return res;
}

signed main(){
	
	cin >> n >> k;
	for(int i = 1;i < n;++ i){
		int a,b;
		cin >> a >> b;
		ed[a].push_back(b);
		ed[b].push_back(a);
	}
	for(int i = 1;i <= k;++ i){
		int vv;
		cin >> vv;
		v[vv] = 1;
		if(!rt) rt = vv;
	}
	
	cout << dfs(rt,0);
	
	return 0;
	
}