目录
A、Remove Smallest(模拟)
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 50007;
int a[N];
int n, m, t;
int main()
{
scanf("%d", &t);
while(t -- ){
scanf("%d", &n);
bool flag = 0;
for(int i = 1; i <= n; ++ i){
scanf("%d", &a[i]);
}
sort(a + 1, a + 1 + n);
for(int i = 1; i < n; ++ i){
if(a[i + 1] - a[i] > 1){
flag = 1;
break;
}
}
if(!flag)puts("YES");
else puts("NO");
}
return 0;
}
B、Gifts Fixing(模拟)
![在这里
#include<iostream>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int N = 50007, INF = 0x3f3f3f3f;
int n, m, t;
int a[N], b[N];
int mina, minb;
int main(){
cin >> t;
while(t -- ){
cin >> n;
mina = INF, minb = INF;
for(int i = 1; i <= n; ++ i){
cin >> a[i], mina = min(mina, a[i]);
}
for(int i = 1; i <= n; ++ i)
cin >> b[i], minb = min(minb, b[i]);
ll ans = 0;
for(int i = 1; i <= n; ++ i){
ans += max(a[i] - mina, b[i] - minb);
}
cout << ans << endl;
}
return 0;
}
C、Boats Competition(暴力枚举)
直接暴力枚举结果s即可。
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 5007;
int n, m, t;
int a[N];
int main(){
cin >> t;
while(t -- ){
cin >> n;
for(int i = 1; i <= n; ++ i){
scanf("%d", &a[i]);
}
sort(a + 1, a + 1 + n);
int res = 0;
for(int s = 2; s <= 2 * n; ++ s){
int l = 1, r = n;
int ans = 0;
while(l < r){
if(a[l] + a[r] > s)r -- ;
else if(a[l] + a[r] < s)l ++ ;
else ans ++ , l ++ , r -- ;
}
res = max(res, ans);
}
cout << res <<endl;
}
return 0;
}
D、Binary String To Subsequences(字符串,类并查集)
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 500007;
int pre[N][2], a[N];
int last[2];
int ans[N];
string s;
int n, m;
int t;
int num[N];
bool vis[N];
int cnt;
int find(int x, int val)
{
if(!x)return 0;
if(!vis[x])
{
vis[x] = 1;
return x;
}
return pre[x][val] = find(pre[x][val], val);
}
int main(){
scanf("%d", &t);
while(t -- ){
memset(vis, 0, sizeof vis);
memset(num, 0, sizeof num);
scanf("%d", &n);
int res = n;
cnt = 0;
cin >> s;
last[0] = last[1] = 0;
for(int i = 1; i <= n; ++ i){
a[i] = s[i - 1] - '0';
pre[i][a[i] ^ 1] = last[a[i] ^ 1];
pre[i][a[i]] = last[a[i]];
last[a[i]] = i;
ans[i] = i;
}
for(int i = 1; i <= n; ++ i){
int point = find(pre[i][a[i] ^ 1], a[i] ^ 1);
if(point){
res -- ;
ans[i] = ans[point];
}
}
printf("%d\n", res);
for(int i = 1; i <= n; ++ i){
if(!num[ans[i]])
num[ans[i]] = ++ cnt;
printf("%d ", num[ans[i]]);
}
puts("");
}
return 0;
}
E1、Weights Division (easy version)(贪心、树上dfs)
全部改成long long就A了
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define int long long
typedef long long ll;
using namespace std;
const int N = 500007, M = 5000007;
int n, m;
int head[N], nex[M], ver[M], edge[M], tot;
struct node{
int val, son;
bool operator<(const node &t)const {
return (val - val / 2) * son < (t.val - t.val / 2) * t.son;
}
};
priority_queue<node>heap;
ll S, sum;
int t;
bool vis[N];
void add(int x, int y, int z){
ver[tot] = y;
edge[tot] = z;
nex[tot] = head[x];
head[x] = tot ++ ;
}
int dfs(int x, int fa){
int cnt = 0;//儿子个数
for(int i = head[x]; ~i;i = nex[i]){
int y = ver[i], z = edge[i];
if(y != fa){
int num = dfs(y, x);
heap.push({z, num});
sum += z * num * 1ll;
cnt += num;
}
}
return max(cnt, 1ll);//可能是叶子节点
}
signed main(){
scanf("%lld", &t);
while(t -- ){
scanf("%lld%lld", &n, &S);
memset(head, -1, sizeof head);
memset(vis, 0, sizeof vis);
sum = 0;
tot = 0;
while(heap.size())heap.pop();
for(int i = 1, x, y, z; i <= n - 1; ++ i){
scanf("%lld%lld%lld", &x, &y, &z);
add(x, y, z), add(y, x ,z);
}
//int xx = 0;
dfs(1, 0);
ll ans = 0;
while(sum > S){
auto x = heap.top();
heap.pop();
//cout << x.val << "ok" <<x.son <<endl;
sum -= (x.val - x.val / 2) * x.son *1ll;
x.val /= 2;
heap.push(x);
ans ++ ;
//cout << sum << endl;
}
//cout << xx ++ << endl;
printf("%lld\n", ans);
}
return 0;
}