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 }
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 }