bzoj 1707: [Usaco2007 Nov]tanning分配防晒霜【贪心||最大流(?)】

洛谷上能过的最大流bzoj上T了……但是贪心做法明明在洛谷上比最大流要慢啊……如果是最大流的话就是裸题了吧

说一下贪心,就按照防晒霜排序,然后对每一个防晒霜选一头可以使用的且r最小的牛

就,没了。

贪心

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2505;
int n,m,ans,l[N],r[N];
bool used[N];
struct qwe
{
    int v,c;
}a[N];
inline bool cmp(qwe a,qwe b)
{
    return a.v<b.v;
}
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
int find(int x)
{
    int tmp=0,mn=1e9;
    for(int i=1;i<=n;i++)
        if(!used[i]&&l[i]<=x&&r[i]>=x&&r[i]<mn)
            mn=r[i],tmp=i;
    return tmp;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
        l[i]=read(),r[i]=read();
    for(int i=1;i<=m;i++)
        a[i].v=read(),a[i].c=read();
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;i++)
        while(a[i].c--)
        {
            int tmp=find(a[i].v);
            if(tmp)
                used[tmp]=1,ans++;
        }
    printf("%d",ans);
    return 0;
}

最大流……

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=5005,inf=1e9;
int n,m,l[N],r[N],h[N],cnt=1,s,t,le[N];
struct qwe
{
    int ne,to,va;
}e[10000005];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v,int w)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    e[cnt].va=w;
    h[u]=cnt;
}
void ins(int u,int v,int w)
{
    add(u,v,w);
    add(v,u,0);
}
bool bfs()
{
    queue<int>q;
    memset(le,0,sizeof(le));
    le[s]=1,q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=h[u];i;i=e[i].ne)
            if(!le[e[i].to]&&e[i].va>0)
            {
                le[e[i].to]=le[u]+1;
                q.push(e[i].to);
            }
    }
    return le[t];
}
int dfs(int u,int f)
{
    if(u==t||!f)
        return f;
    int us=0;
    for(int i=h[u];i&&us<f;i=e[i].ne)
        if(le[e[i].to]==le[u]+1&&e[i].va>0)
        {
            int t=dfs(e[i].to,min(e[i].va,f-us));
            e[i].va-=t;
            e[i^1].va+=t;
            us+=t;
        }
    if(!us)
        le[u]=0;
    return us;
}
int dinic()
{
    int re=0;
    while(bfs())
        re+=dfs(s,inf);
    return re;
}
int main()
{
    n=read(),m=read();
    s=0,t=n+m+1;
    for(int i=1;i<=n;i++)
        l[i]=read(),r[i]=read(),ins(s,i,1);
    for(int i=1;i<=m;i++)
    {
        int x=read(),c=read();
        for(int j=1;j<=n;j++)
            if(l[j]<=x&&r[j]>=x)
                ins(j,i+n,1);
        ins(i+n,t,c);
    }
    printf("%d\n",dinic());
    return 0;
}

原文地址:https://www.cnblogs.com/lokiii/p/8997618.html

时间: 2024-10-09 07:55:19

bzoj 1707: [Usaco2007 Nov]tanning分配防晒霜【贪心||最大流(?)】的相关文章

BZOJ 1707: [Usaco2007 Nov]tanning分配防晒霜

Description 奶牛们计划着去海滩上享受日光浴.为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜.第i头奶牛适合的最小和最 大的SPF值分别为minSPF_i和maxSPF_i(1 <= minSPF_i <= 1,000; minSPF_i <= maxSPF_i <= 1,000).如果某头奶牛涂的防晒霜的SPF值过小,那么阳光仍然能 把她的皮肤灼伤:如果防晒霜的SPF值过大,则会使日光浴与躺在屋里睡觉变得 几

1707: [Usaco2007 Nov]tanning分配防晒霜

1707: [Usaco2007 Nov]tanning分配防晒霜 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 548  Solved: 262[Submit][Status] Description 奶牛们计划着去海滩上享受日光浴.为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜.第i头奶牛适合的最小和最 大的SPF值分别为minSPF_i和maxSPF_i(1 <= minSPF_i &l

BZOJ1707 : [Usaco2007 Nov]tanning分配防晒霜

S向每头奶牛连边,容量1 每个防晒霜向T连边,容量cover 每头奶牛向SPF在自己范围内的防晒霜连边,容量inf 用线段树优化建图跑最大流即可. #include<cstdio> const int N=7010,inf=~0U>>2; struct edge{int t,f;edge*nxt,*pair;}*g[N],*d[N],pool[60000],*cur=pool,*p; int n,m,tot,root,id[N],l[N],r[N],spf[N][2],i,x,y,

矩阵乘法专题2——bzoj 1706 [usaco2007 Nov] relays 奶牛接力跑 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24960651 [原题] 1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 340  Solved: 162 [Submit][Status] Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力

BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间( dp )

水dp 先按开始时间排序 , 然后dp. dp( i ) 表示前 i 个时间段选第 i 个时间段的最优答案 , 则 dp( i ) = max( dp( j ) ) + w_i ( 0 < j < i ) , answer = max( dp( i ) ) ( 1 <= i <= m ) ------------------------------------------------------------------------------------------- #inclu

[BZOJ] 1706: [usaco2007 Nov]relays 奶牛接力跑

1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 707  Solved: 367[Submit][Status][Discuss] Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100)条跑道上. 农场上的跑道有一些交汇点,每条跑道都连结

BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )

直接floyd.. ---------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i ) #define clr( x

BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换

Description FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加"年度最佳老农"的比赛.在比赛中,每个农夫把他的奶牛排成一列,然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母(the initial letter of every cow),举个例子,FJ带了Bessie, Sylvia,和Dora,那么就可以缩写为BSD. FJ只需将奶牛的一个序列重新排列,然后参加比赛.他可以让序列中的第一头奶牛,或者最后一头走出来,站到新队列的队尾. 利欲熏

BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏

Description Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏.她们很累,所以她们想消耗最少的能量来跨栏. 显然,对于一头奶牛跳过几个矮栏是很容易的,但是高栏却很难.于是,奶牛们总是关心路径上最高的栏的高度. 奶牛的训练场中有 N (1 ≤ N ≤ 300) 个站台,分别标记为1..N.所有站台之间有M (1 ≤ M ≤ 25,000)条单向路径,第i条路经是从站台Si开始,到站台Ei,其中最高的栏的高度为Hi (1 ≤ Hi ≤ 1,000,000)