lougu4394:

N个政党要组成一个联合内阁,每个党都有自己的席位数.

现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好.

对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的.

将最后一个限制转化成,去掉所选的最小的,剩下的小于等于总数的一半

根据上面的转化,将a[i],从大到小排序考虑,01背包即可

code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int MAXX = 330; int sum, n;
int a[MAXX];
bool f[310][100100];
inline bool cmp (int a, int b) {
return a > b;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
}
sort(a + 1, a + n + 1, cmp);
f[0][0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= sum; ++j) {
f[i][j] |= f[i - 1][j];
if(j - a[i] >= 0 && j - a[i] <= (sum / 2))f[i][j] |= f[i - 1][j - a[i]];
}
}
int ans = 0;
for (int i = sum / 2; i <= sum ; ++i) if (f[n][i]) ans = i;
printf("%d", ans);
return 0;
}

luogu2966:

在无向连通图中,有点权,有边权,给出多次询问起点和终点的(路径边权和 + 路径上最大值)的最小值

根据floyd,f[k][i][j]表示从i到j,经过的编号<=k,的最短路,其实k的顺序没有关系,我们不妨按照点权从小打到大排序抉择,当前的k一定是路径上的最大点(不包括i,j)

code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cctype> using namespace std; const int MAXX = 300; struct node
{
int id, val;
bool operator < (const node & a) const {
return val < a.val;
}
}pot[MAXX];
int dis[MAXX][MAXX], ans[MAXX][MAXX], mp[MAXX][MAXX], pm[MAXX];
int n, m, q;
inline int rd() {
int x = 0; bool f = 0;
char c = getchar();
while (!isdigit(c)) {
if (c == '-') f = 1;
c =getchar();
}
while (isdigit(c)) {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f ? -x : x;
}
int main() {
n = rd(); m = rd(); q = rd();
memset(dis, 0x3f, sizeof(dis));
memset(ans, 0x3f, sizeof(ans));
memset(mp, 0x3f, sizeof(mp));
for (int i = 1; i <= n; ++i) {
dis[i][i] = 0x3f3f3f3f;
pot[i].id = i;
pot[i].val = rd();
pm[i] = pot[i].val;
}
sort(pot + 1, pot + 1 + n);
for (int i = 1; i <= m; ++i) {
int x, y, z;
x = rd(); y = rd(); z = rd();
mp[x][y] = mp[y][x] = min(min(mp[x][y], mp[y][x]), z);
dis[x][y] = dis[y][x] = min(dis[x][y], min(dis[y][x], mp[x][y]));
}
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
dis[i][j] = min (dis[i][j], dis[i][pot[k].id] + dis[pot[k].id][j]);
ans[i][j] = min (ans[i][j], dis[i][j] + max(max( pm[i], pm[j] ), pot[k].val) );
}
}
}
while (q--) {
int u, v;
u = rd(); v =rd();
printf("%d\n",min(ans[u][v], ans[v][u]));
}
return 0;
}

lougu 3537:

有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i])。

再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得:

对于每个选的物品i,满足a[i]<=m且b[i]>m+s。

所有选出物品的c[i]的和正好是k。

如果没有限制的话那么直接背包可行性dp即可

如果只有a[i] <= m,那我们可以离线,将询问按照m从小到大排序,将物品按照a从小到大排序,对于一个询问我们处理比他小的a,对于a我们处理刚好比他大的m,这样这个限制就解决了

我们考虑最后一个限制,不如dp一下,这条限制相当于所选的集合中最小的b要大于\(m + s\),那我们设计状态为f[k],表示恰好装k的方案中最小的b最大是多少,最后我们只要是判断一下\(f[k] > m + s\),即可

code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cctype>
#include <algorithm> using namespace std; const int MAXX = 1010; struct node
{
int a, b, c;
bool operator < (const node & A) const {
return a < A.a;
}
}t[MAXX];
struct query
{
int m, k, s, id;
bool operator < (const query & A) const {
return m < A.m;
}
}q[MAXX * MAXX];
int n, k;
int f[100100];
bool ans[1001000];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d%d%d", &t[i].c, &t[i].a, &t[i].b);
scanf("%d", &k);
for (int i = 1; i <= k; ++i) {
scanf("%d%d%d",&q[i].m, &q[i].k, &q[i].s);
q[i].id = i;
}
sort(t + 1, t + n + 1);
sort(q + 1, q + k + 1);
int ptr = 1;
//memset(f, -0x3f, sizeof(f));
f[0] = 1e9;
for (int i = 1; i <= k; ++i) {
while (t[ptr].a <= q[i].m && ptr <= n) {
for (int j = 100000; j >= t[ptr].c; --j)
f[j] = max(f[j],min(f[j - t[ptr].c], t[ptr].b));
ptr++;
}
if (f[q[i].k] > q[i].m + q[i].s)ans[q[i].id] = 1;
}
for (int i = 1; i <= k; ++i) {
if (ans[i]) printf("TAK\n");
else printf("NIE\n");
}
return 0;
}

转移顺序的艺术 luogu4394 + lougu2966 + luogu3537的更多相关文章

  1. bzoj2595

    一开始看是插头dp,后来发现还有一个叫斯坦纳树的东西 什么叫斯坦纳树,就是使给定点连通开销和最小的树(可以包含多余的点) 到这张平面图上,我们不难想到用dp来解决,设f[x,y,S]表示连通集合为S, ...

  2. bzoj 2251: [2010Beijing Wc]外星联络 后缀数组

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 424  Solved: 232[Submit][ ...

  3. 通过 PowerShell 支持 Azure Traffic Manager 外部端点和权重轮询机制

    Jonathan TulianiAzure网络 - DNS和 Traffic Manager高级项目经理 在北美 TechEd 大会上,我们宣布了 Azure Traffic Manager将支持 ...

  4. UVA 674 Coin Change(dp)

    UVA 674  Coin Change  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/ ...

  5. [NOIP2017] 逛公园

    [NOIP2017] 逛公园 题目大意: 给定一张图,询问长度 不超过1到n的最短路长度加k 的1到n的路径 有多少条. 数据范围: 点数\(n \le 10^5\) ,边数\(m \le 2*10^ ...

  6. ●BZOJ 2149 拆迁队

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题解: 斜率优化DP,栈维护凸包,LIS,分治(我也不晓得是不是CDQ分治...) 一 ...

  7. NOIP2014-3-15模拟赛

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

  8. [Codeforces]605E Intergalaxy Trips

    小C比较棘手的概率期望题,感觉以后这样的题还会贴几道出来. Description 给定一个n*n的邻接矩阵,邻接矩阵中元素pi,j表示的是从 i 到 j 这条单向道路在这一秒出现的概率百分比,走一条 ...

  9. bzoj 4244 括号序列dp

    将各种情况绕环等看作括号序列,括号内的区域上下都需要累加答案,左右也是 f[i][j] 代表 前i个车站已经处理完的有j个左括号的最小权值 我们可以发现,更新的来源来自于 i-1, 和 i 将上 描述 ...

随机推荐

  1. Swift学习笔记(7):函数

    目录: 函数参数与返回值 参数标签和参数名称 可变参数 传入传出参数 函数类型 嵌套函数 函数是一段完成特定任务的独立代码片段,使用func标示函数名,使用->标示返回类型. ・可以为函数参数设 ...

  2. android之handler机制深入解析

    一.android中需要另开线程处理耗时.网络的任务,但是有必须要在UI线程中修改组件.这样做是为了: ①只能在UI线程中修改组件,避免了多线程造成组件显示混乱 ②不使用加锁策略是为了提高性能,因为a ...

  3. Caffe学习--Layer分析

    Caffe_Layer 1.基本数据结构 //Layer层主要的的参数 LayerParamter layer_param_; // protobuf内的layer参数 vector<share ...

  4. rman备份工具简介

    RMAN工具简介: 备份的文件: 数据文件 归档日志 控制文件(当前控制文件) spfile 自动管理备份相关元数据 文件名称 完成备份的scn 以数据块为单位,只备份使用过的数据块(物理层面判断是否 ...

  5. Matlab---从入门到精通 Chapter 4 编程基础

    ---恢复内容开始--- 4-1 M文件编辑器 在命令窗口输入edit命令,可以打开M文件编辑器,创建新的M文件 在命令行中输入edit filename,那么可以打开在当前目录环境下的M文件 4-2 ...

  6. pagination使用说明

    参考自张鑫旭 准备工作 下载jquery.min.js 下载jquery.pagination.js 下载pagination.css 开始敲代码 第一步,引入刚刚下载的三个文件 <link r ...

  7. 12种CSS BUG解决方法与技巧

    一. 针对浏览器的选择器 这些选择器在你需要针对某款浏览器进行css设计时将非常有用. IE6及其更低版本,本文由52CSS.com整理,转载请注明出处! * html {} IE7及其更低版本 *: ...

  8. 2017-2-10 bash基础脚本

    练习:写一脚本,实现如下功能: 1.让用户通过键盘输入一个用户名,如果用户不存在就退出: 2.如果其UID等于其GID,就说它是个"good guy" 3.否则,就说它是个“bad ...

  9. NodeJS学习笔记 (4)网络服务-http(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己敲代码: http模块概览 大多数nodejs开发者都是冲着开发web server的目的选 ...

  10. Chrome扩展程序推荐

    Chrome扩展程序 AdBlock 印象笔记 网页截图:注释&录屏 油猴 zenmate-vpn sourcegraph 推荐网站