poj3461
题目概述:有c头牛,牛要晒太阳,涂防晒霜,每头牛有不同的防晒霜承受等级,有L种防晒霜,每种对应的数量和等级,求最多涂多少瓶防晒霜
思路:将牛和防晒霜排序,贪心
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
struct niu{
int maxn,minn;
}a[3000];
struct fss{
int num,s;//num数量,s是效果
}b[3000];
int c,l,ans=0;
bool cmp1(niu x,niu y){
return (x.minn !=y.minn ? x.minn>y.minn : x.maxn>y.maxn );
}
bool cmp2(fss x,fss y){
return x.s<y.s ;
}
int main(){
cin>>c>>l;
for(int i=1;i<=c;i++){
cin>>a[i].minn >>a[i].maxn ;
}
sort(a+1,a+c+1,cmp1);
for(int i=1;i<=l;i++){
cin>>b[i].s >>b[i].num ;
}
sort(b+1,b+l+1,cmp2);
for(int i=1;i<=c;i++){//从牛要求最高的开始
for(int j=l;j>=1;j--){// 防晒霜从最高级开始
if(b[j].s<=a[i].maxn &&b[j].s >=a[i].minn &&b[j].num >0){
ans++;
b[j].num--;
break;
}
}
}
cout<<ans;
return 0;
}
poj3190
题目概括:有n头牛,每头牛需要占用一个时间段的时间来挤奶,且必须有机器。问最少需要多少个机器
思路:只要两个牛时间不重复,就用一个机器,贪心+优先队列
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,num[60000];
struct niu {
int l,r,m;
bool operator <(const niu &a)const {
if(r==a.r) {
return l>a.l;
}
return r>a.r ;
}
} a[60000];
bool cmp(niu x,niu y) {
return (x.l ==y.l ? x.r<y.r : x.l<y.l);
}
priority_queue<niu> q;
int main() {
while(cin>>n) {
for(int i=0; i<n; i++) {
cin>>a[i].l >>a[i].r ;
a[i].m=i;//给每头牛标号
}
sort(a,a+n,cmp);
q.push(a[0]);
int ans=1;
int time=0;
num[a[0].m]=1;
for(int i=1; i<n; i++) {
if(!q.empty()&&q.top().r<a[i].l ) {
num[a[i].m ]=num[q.top().m];
q.pop();
} else {
ans++;
num[a[i].m]=ans;
}
q.push(a[i]);
}
cout<<ans<<endl;
for(int i=0; i<n; i++) {
cout<<num[i]<<endl;
}
while(!q.empty())
q.pop();
}
return 0;
}
今日头条CH炸了