5月6日

poj3614

题意:

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。那么为了不让奶牛烫伤,又不会没有效果。给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了.每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。

分析:将奶牛按照可以忍受光强的最大值从小到大排序,然后用一个从小到大取数值的优先队列维护各种防晒霜即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=2502;
15 typedef struct p
16 {
17     int minx,mx;
18 }p;
19 p s[maxn];
20 int vis[maxn];
21 int c,l;
22 bool cmp(p a,p b)
23 {
24     return a.mx<b.mx;
25 }
26 int main()
27 {
28     while(cin>>c>>l)
29     {
30         for(int i=0;i<c;i++)
31             cin>>s[i].minx>>s[i].mx;
32         memset(vis,0,sizeof(vis));
33         priority_queue<int,vector<int>, greater<int> > que;
34         for(int i=0;i<l;i++){
35             int x,y;
36             scanf("%d%d",&x,&y);
37             for(int i=0;i<y;i++)
38                 que.push(x);
39         }
40         sort(s,s+c,cmp);
41         int cnt=0;
42         while(!que.empty()){
43             int t=que.top();
44             que.pop();
45             for(int i=0;i<c;i++){
46                 if(!vis[i]&&t>=s[i].minx&&t<=s[i].mx){
47                     vis[i]=1; cnt++; break;
48                 }
49             }
50         }
51         cout<<cnt<<endl;
52     }
53     return 0;
54 }
View Code

 poj2010

题意:

奶牛大学招生,从C头奶牛中招收N头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,找出其中得分中位数最高。求此中位数。

分析:非常好的题目,参考了题解才做出来的。我们先把奶牛按照分数递增的顺序进行排列,然后我们分别对与每一个数i,使其作为中位数,分别统计前num个和后num个数的aid值,然后最后枚举一下,找出dp1[i]+dp2[i]+s[i].aid<=f的最大i,求出s[i].score即可

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int inf=2000000000;
15 const int maxn=100020;
16 typedef struct p
17 {
18     int score,aid;
19 }p;
20 p s[maxn];
21 int n,c,f;
22 bool cmp(p a,p b)
23 {
24     return a.score<b.score;
25 }
26 int dp1[maxn],dp2[maxn];
27 int main()
28 {
29     while(cin>>n>>c>>f)
30     {
31         for(int i=0;i<c;i++)
32             scanf("%d%d",&s[i].score,&s[i].aid);
33         int sum=0;
34         int num=n/2;
35         sort(s,s+c,cmp);
36         priority_queue<int> que1;
37         for(int i=0;i<c;i++){
38             if(que1.size()==num)
39                 dp1[i]=sum;
40             else
41                 dp1[i]=inf;
42             sum+=s[i].aid;
43             que1.push(s[i].aid);
44             if(que1.size()>num){
45                 int t=que1.top();
46                 que1.pop();
47                 sum=sum-t;
48             }
49         }
50             int ans=0;
51             priority_queue<int> que2;
52             for(int i=c-1;i>=0;i--){
53                 if(que2.size()==num)
54                     dp2[i]=ans;
55                 else
56                     dp2[i]=inf;
57                 ans+=s[i].aid;
58                 que2.push(s[i].aid);
59                 if(que2.size()>num){
60                 int h=que2.top();
61                 que2.pop();
62                 ans=ans-h;
63                 }
64         }
65         int k=-1;
66         for(int i=0;i<c;i++){
67             if(dp1[i]+dp2[i]+s[i].aid<=f)
68             k=s[i].score;
69         }
70         cout<<k<<endl;
71     }
72     return 0;
73 }
View Code

 

posted @ 2016-05-08 20:50  wolf940509  阅读(234)  评论(0编辑  收藏  举报