1 /**************************************************************
2 Problem: 1707
3 User: HansBug
4 Language: Pascal
5 Result: Accepted
6 Time:1228 ms
7 Memory:43156 kb
8 ****************************************************************/
9
10 type
11 point=^node;
12 node=record
13 g,w:longint;
14 next,anti:point;
15 end;
16 var
17 i,j,k,l,m,n,s,t,ans:longint;
18 a:array[0..10000] of point;
19 d,dv,b,c,e,f:array[0..10000] of longint;
20 function min(x,y:longint):longint;inline;
21 begin
22 if x<y then min:=x else min:=y;
23 end;
24 procedure add(x,y,z:longint);inline;
25 var p:point;
26 begin
27 new(p);p^.g:=y;p^.w:=z;p^.next:=a[x];a[x]:=p;
28 new(p);p^.g:=x;p^.w:=0;p^.next:=a[y];a[y]:=p;
29 a[x]^.anti:=a[y];a[y]^.anti:=a[x];
30 end;
31 function dfs(x,flow:longint):longint;inline;
32 var i,j,k,l:longint;p:point;
33 begin
34 if x=t then exit(flow);
35 dfs:=0;p:=a[x];
36 while p<>nil do
37 begin
38 if (p^.w>0) and (d[x]=(d[p^.g]+1)) then
39 begin
40 k:=dfs(p^.g,min(flow-dfs,p^.w));
41 dec(p^.w,k);
42 inc(p^.anti^.w,k);
43 inc(dfs,k);
44 if dfs=flow then exit;
45 end;
46 p:=p^.next;
47 end;
48 if d[s]=n then exit;
49 dec(dv[d[x]]);
50 if dv[d[x]]=0 then d[s]:=n;
51 inc(d[x]);
52 inc(dv[d[x]]);
53 end;
54 begin
55 readln(n,m);
56 for i:=1 to n do readln(b[i],c[i]);
57 for i:=1 to m do readln(e[i],f[i]);
58 for i:=1 to n+m+2 do a[i]:=nil;
59 for i:=1 to m do add(1,i+1,f[i]);
60 for i:=1 to n do add(m+1+i,n+m+2,1);
61 for i:=1 to m do
62 for j:=1 to n do
63 if (e[i]<=c[j]) and (e[i]>=b[j]) then add(i+1,m+1+j,1);
64 s:=1;t:=n+m+2;n:=n+m+2;
65 fillchar(d,sizeof(d),0);
66 fillchar(dv,sizeof(dv),0);
67 ans:=0;dv[0]:=n;
68 while d[1]<n do inc(ans,dfs(s,maxlongint));
69 writeln(ans);
70 readln;
71 end.
简单的讲一下贪心思路吧。首先将奶牛按照spf的上限由小到大排序,然后每个奶牛取能取到的最小的spf的防晒霜。
贪心正确性简述:如某只奶牛能使用多种防晒霜,那么这些防晒霜的spf值一定不会超过后面的奶牛的spf上限,即后面的奶牛只要spf下限低于这些防晒霜即可使用。那么,为了对后面影响最小,即取用最小spf防晒霜。若因次奶牛使用了某防晒霜导致后面某只奶牛无法使用防晒霜,则这两只奶牛即为等效的,不会对答案造成影响。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,l;
struct Crow{
int maxS;
int minS;
};
Crow c[2505];
struct Spf{
int spf;
int num;
};
Spf s[2505];
inline bool cmp(Crow a,Crow b){
if (a.maxS<b.maxS) return true;
return false;
}
int main(){
scanf("%d%d",&n,&l);
for (int i=1;i<=n;i++) scanf("%d%d",&c[i].minS,&c[i].maxS);
for (int i=1;i<=l;i++) scanf("%d%d",&s[i].spf,&s[i].num);
sort(c+1,c+n+1,cmp);
int index;
int Ans=0;
for (int i=1;i<=n;i++){
index=-1;
for (int j=1;j<=l;j++){
if (s[j].num>0 && c[i].minS<=s[j].spf && s[j].spf<=c[i].maxS){
if (index==-1){
index=j;
}else{
if (s[j].spf<s[index].spf) index=j;
}
}
}
if (index!=-1){
Ans++;
s[index].num--;
}
}
printf("%d\n",Ans);
return 0;
}