Codeforces 762B

题目大意:

有a台只有USB接口的电脑,b台PS/2接口的电脑,c台两种接口都有的电脑。每台电脑只用装一个鼠标。给出n个鼠标及其费用,每个鼠标只能使用一遍。在最大化有鼠标的电脑数目的情况下最小化费用。

\((0 \le a,b,c \leq 10^5 , n \leq 3*10^5 )\)

题解:

这道题我们很容易抽象出来一个网络流模型

我们设超级源汇为S,T,每台电脑和鼠标都抽象成一个节点

我们可以这么建图

S -> 每台电脑 (flow = 1,cost = 0)

USB(PS/2)电脑 -> 所有USB(PS/2)鼠标(flow = 1,cost = 0)

双接口电脑 -> 所有鼠标(flow = 1,cost = 0)

所有鼠标 -> T (flow = 1,cost = \(cost_i\))

然后跑最小费用最大流即可

TLE

我们可以考虑简化构图,我们发现我们每台电脑只有三种连接可能,并且有一种链接方式是由其他的两种链接组成的,所以我们增设两个节点,分别连接所有的USB,PS/2鼠标,然后我们不用从电脑向每个鼠标都连边了,只用加在这两个点上就好了,边数大大减少

TLE

我们发现实际上同种鼠标之间并没有什么区别,所以我么把所有相同的鼠标也缩成一个点.这样把点数降低到了7个点,整张图上只有7个点。但边数还是有些大。。。

TLE

我CNMLGB !!!

我们发现把网络流化简到这个地步以后其实就是一个贪心。。

所以我们模拟这个贪心过程

具体怎么模拟呢。。。

我们把两种不同鼠标分别拍个序,首先取满所有的只能使用这个接口的电脑

然后对于两个接口都能使用的电脑,用一个类似于归并排序的过程即可。

WoC,这么简单的题为什么当时我没想出来!!

T的不要不要的费用流

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 300010;
const int maxnode = 1024;
const int maxedge = maxn<<1;
const int inf = 0x3f3f3f3f;
struct Edge{
int to,next,cap;
ll cost;
}G[maxedge];
int head[maxnode],cnt=1;
inline void add(int u,int v,int c,ll d){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].cap = c;
G[cnt].cost = d;
}
inline void insert(int u,int v,int c,ll d){
add(u,v,c,d);add(v,u,0,-d);
}
#define v G[i].to
ll dis[maxnode],ans;int flow[maxnode];
const int lim = maxn<<1;
int q[lim + 10],p[maxnode];
int S,T,l,r,flo;bool inq[maxnode];
bool spfa(){
memset(dis,0x3f,sizeof dis);
dis[S] = 0;inq[S] = true;
l = 0;r = -1;q[++r] = S;
flow[S] = 0x3f3f3f3f;
while(l <= r){
int u = q[l % lim];++l;
for(int i = head[u];i;i=G[i].next){
if(dis[v] > dis[u] + G[i].cost && G[i].cap){
dis[v] = dis[u] + G[i].cost;
flow[v] = min(G[i].cap,flow[u]);
p[v] = i;
if(!inq[v]){
inq[v] = true;
q[++r % lim] = v;
}
}
}inq[u] = false;
}if(dis[T] == dis[0]) return false;
ans += 1LL*flow[T]*dis[T];
flo += flow[T];
for(int u = T;u != S;u = G[p[u]^1].to)
G[p[u]].cap -= flow[T],G[p[u]^1].cap += flow[T];
return true;
}
#undef v
char s[10];
int main(){
int a,b,c,n;read(a);read(b);read(c);
read(n);
int nodecnt = n;
S = ++nodecnt;
int node1 = ++nodecnt;insert(S,node1,a,0);
int node2 = ++nodecnt;insert(S,node2,b,0);
int node3 = ++nodecnt;insert(S,node3,c,0);
int mob1 = ++nodecnt;
int mob2 = ++nodecnt;
int mob3 = ++nodecnt;
int x;T = ++nodecnt;
for(int i=1;i<=n;++i){
read(x);scanf("%s",s);
if(!strcmp(s,"USB")){
insert(node1,mob1,inf,0);
insert(node3,mob1,inf,0);
insert(mob1,T,1,x);
}else{
insert(node2,mob2,inf,0);
insert(node3,mob2,inf,0);
insert(mob2,T,1,x);
}
}
while(spfa());
printf("%d %I64d\n",flo,ans);
getchar();getchar();
return 0;
}

正解的贪心

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 300010;
ll c1[maxn],cnt1;
ll c2[maxn],cnt2;
char s[10];
int main(){
int a,b,c,n;read(a);read(b);read(c);
read(n);ll x;
for(int i=1;i<=n;++i){
read(x);
scanf("%s",s);
if(!strcmp(s,"USB")){
c1[++cnt1] = x;
}else{
c2[++cnt2] = x;
}
}
sort(c1+1,c1+cnt1+1);
sort(c2+1,c2+cnt2+1);
int p1=0,p2=0;
ll ans = 0;
for(p1 = 1;p1 <= a && p1 <= cnt1; ++ p1) ans += c1[p1];
for(p2 = 1;p2 <= b && p2 <= cnt2; ++ p2) ans += c2[p2];
c1[cnt1+1] = c2[cnt2+1] = 1LL<<60;
while(c){
if(p1 > cnt1 && p2 > cnt2) break;
if(c1[p1] < c2[p2]) ans += c1[p1++];
else ans += c2[p2++];
--c;
}
printf("%d %I64d\n",p1+p2-2,ans);
getchar();getchar();
return 0;
}

Codeforces 762B USB vs. PS/2 贪心的更多相关文章

  1. CodeForce-762B USB vs. PS/2(贪心)

    USB vs. PS/2 CodeForces - 762B 题意:有三种电脑,分别有a.b.c个,第一种只有USB接口,第二种只有PS/2接口,第三种有两种接口,有m个鼠标,告诉你价钱和接口类型,问 ...

  2. 【codeforces 762B】USB vs. PS/2

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. Codeforces 437C The Child and Toy(贪心)

    题目连接:Codeforces 437C  The Child and Toy 贪心,每条绳子都是须要割断的,那就先割断最大值相应的那部分周围的绳子. #include <iostream> ...

  4. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. Codeforces Educational Codeforces Round 3 C. Load Balancing 贪心

    C. Load Balancing 题目连接: http://www.codeforces.com/contest/609/problem/C Description In the school co ...

  7. Codeforces Testing Round #12 B. Restaurant 贪心

    B. Restaurant Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/597/problem ...

  8. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

  9. CodeForces - 777B Game of Credit Cards 贪心

    题目链接: http://codeforces.com/problemset/problem/777/B 题目大意: A, B玩游戏,每人一串数字,数字不大于1000,要求每人从第一位开始报出数字,并 ...

随机推荐

  1. rtems 4.11 启动流程(arm, beagle)

    请参照官方的 bsp_howto 文档,对arm来说,首先执行的文件是start.S start.S c/src/lib/libbsp/arm/shared/start/start.S 1.从 _st ...

  2. redis错误error记录

    早上登服务器,看到程序的redis的报错, 具体如下: (error) MISCONF Redis is configured to save RDB snapshots, but is curren ...

  3. 用array_search 数组中查找是否存在这个 值

    #判读里面是否还有id=1的超级管理员 $key=array_search(1, $ids); #判读这个是否存在 if($key!==FALSE){ #如果存在就unset掉这个 unset($id ...

  4. Flyweight Design Pattern 共享元设计模式

    就是利用一个类来完毕多种任务.不用每次都创建一个新类. 个人认为这个设计模式在C++里面,好像能够就使用一个函数取代,利用重复调用这个函数完毕任务和重复利用这个类,好像几乎相同. 只是既然是一个设计模 ...

  5. C#判断WebService接口是否可用

    using MSXML2; public bool InterfaceEnble() { string url = "http://localhost:81/WebServiceLogin. ...

  6. 九度OJ 1005:Graduate Admission (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5646 解决:1632 题目描述: It is said that in 2011, there are about 100 graduat ...

  7. 九度OJ 1054:字符串内排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7949 解决:4343 题目描述: 输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串. 输入: 测试数据有多组,输 ...

  8. pip3 Fatal error in launcher: Unable to create process using '"' [转]

    在新环境上安装python的时候又再次遇到了这个情况,这次留意了一下,发现原来的文章有错误的地方,所以来更新一下,应该能解决大部分的问题. 环境是win8,原来只安装了python2.7.后来因为要用 ...

  9. Golang 环境变量及工作区概念

    GOROOT go的安装路径 GOPATH 可以有多个目录,每个目录就是一个工作区,放置源码文件,以及安装后的归档文件和可执行文件: 第一个工作区比较重要,go get会自动从一些主流公用代码仓库下载 ...

  10. 运用<ul><li>做导航栏

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...