牛客练习赛43D(贪心)
2024-10-20 13:46:05
有生之年我居然也能不看题解做出来题QAQ……
发现c、d是0、1序列而不是随机数列说明有蹊跷,于是发现负数直接配0,正数配1即可。不知道哪个最小,那就全求一下吧……我的做法的坑点是数正好为1时不可以选。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
const ll inf = 1e18;
int n, a[maxn], b[maxn], ansc[maxn], ansd[maxn];
ll ans = -inf;
void solve(int *a, int *b, int *ansc, int *ansd) {
int c[maxn], d[maxn], t[maxn];
ll sum = 0, C = 0;
for (int i = 1; i <= n; i++) {
if (a[i] > 1) {
c[i] = 1;
C++;
sum += a[i];
} else {
c[i] = 0;
}
}
ll k = 0, D = 0;
for (int i = 1; i <= n; i++) {
t[i] = i;
d[i] = 0;
}
sort(t + 1, t + 1 + n, [&](int x, int y) { return b[x] > b[y]; });
for (int i = 1; i <= n; i++) {
int tmp = t[i];
if (b[tmp] <= 1) break;
d[tmp] = 1;
D++;
k += b[tmp];
if (k >= sum) break;
}
if (k >= sum) {
ll calc = sum - C - D;
if (calc > ans) {
ans = calc;
memcpy(ansc, c, sizeof c);
memcpy(ansd, d, sizeof d);
}
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
solve(a, b, ansc, ansd);
solve(b, a, ansd, ansc);
printf("%lld\n", ans);
for (int i = 1; i <= n; i++)
printf("%d%c", ansc[i], " \n"[i == n]);
for (int i = 1; i <= n; i++)
printf("%d%c", ansd[i], " \n"[i == n]);
}
最新文章
- SQLite使用(三)&;&;核心API使用
- [Membership架构分析1] ASP.NET membership的表结构
- Utility1:Overview
- 最新IP地址数据库Dat格式-高性能高并发版(2017年1月)
- 狗汪汪玩转无线电 -- GPS Hacking
- 说说Statement、PreparedStatement和CallableStatement的异同(转)
- 详解使用icomoon生成字体图标的方法并应用
- 【processing】小代码5
- Windows Phone 支持中国移动官方支付
- jquery实现网页选项卡
- ember.js:使用笔记10 常用方法
- 【Android测试】【第五节】LogCat——命令行
- JQuery简单实现图片轮播效果
- POJ 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心
- 设计一个程序能够将某一个目录下面的所有文件名打印出来---File类的使用
- java 内存数据存储
- 小学生四则运算(java编程)201571030135
- linux ——shell 脚本
- linux基础之awk
- Unity调试模式设置辅助线是否可见