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;
}