第七章 贪心策略
1.M磅猫粮兑换N个房间的性价比最高咖啡豆问题
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int MAXN=1000;
struct JavaBean{
double weight;
double cost;
};
JavaBean arr[MAXN];
bool Compare(JavaBean x,JavaBean y){
return (x.weight/x.cost)>(y.weight/y.cost);
}
int main(){
int m,n;
while(cin>>m>>n){
if(m==-1&&n==-1)
break;
for(int i=0;i<n;i++){
cin>>arr[i].weight>>arr[i].cost;
}
sort(arr,arr+n,Compare);
double answer=0;
for(int i=0;i<n;i++){
if(m>=arr[i].cost){
m-=arr[i].cost;
answer+=arr[i].weight;
}
else{
answer+=arr[i].weight*m/arr[i].cost;
break;
}
}
printf("%.3f\n",answer);
//cout<<setiosflags(ios::fixed)<<setprecision(3)<<answer<<endl;
}
}
2.Senior's Gun
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int MAXN=100001;
long long gun[MAXN];
long long monster[MAXN];
bool Compare(long long x,long long y){
return x>y;
}
int main(){
int caseNumber;
cin>>caseNumber;
while(caseNumber--){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>gun[i];
for(int i=0;i<m;i++)
cin>>monster[i];
sort(gun,gun+n,Compare);
sort(monster,monster+m);
long long answer=0;
for(int i=0;i<n;i++)
{
if(i>=m||gun[i]<=monster[i])
break;
answer+=(gun[i]-monster[i]);
}
cout<<answer<<endl;
}
return 0;
}
3.代理服务器
#include<iostream>
#include<cstring>
using namespace std;
string proxy[1003];
string desxy[5003];
int solve(string p[],int n,string d[],int m){
//每次调用,在目标串中找到最常访问的节点,从该节点开始往后找最长
int i,j,max;
max=-1;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(p[i]==d[j]){
if(j>max)
max=j;
break;
}
}
if(j==m)return 0;
}
if(n==1&&max!=-1)
return -1;
return 1+solve(p,n,d+max,m-max);
}
int main(){
int n,m;
while(cin>>n){
for(int i=0;i<n;i++){
cin>>proxy[i];
}
cin>>m;
for(int i=0;i<m;i++){
cin>>desxy[i];
}
cout<<solve(proxy,n,desxy,m)<<endl;
}
}
4. 今年暑假不AC
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct time{
int start;
int end;
};
time pro[101];
bool Compare(time a,time b){
return a.end<b.end;
}
int main(){
int n;
while(cin>>n&&n!=0){
for(int i=0;i<n;i++)
cin>>pro[i].start>>pro[i].end;
sort(pro,pro+n,Compare);
int cT=0;//记录当前时间
int answer=0;
for(int i=0;i<n;i++){
if(cT<=pro[i].start)
{
answer++;
cT=pro[i].end;
}
}
cout<<answer<<endl;
}
}
5.Case of Fugitive
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct Island{
long long left;
long long right;
};
struct Bridge{
long long length;
long long index;
};
struct Interval{
long long minimum;
long long maximum;
long long index; //区间编号
bool operator< (Interval x)const {
return maxmum> x.maximum;
}
};
bool IntervalCompare(Interval x,Interval y){
if(x.minimum==y.minimum)
return x.maximum<y.maximum;
else
return x.minimum<y.minimum;
}
bool BridgeCompare(Bridge x,Bridge y){
return x.length<y.length;
}
Island island[200001];
Bridge bridge[200001];
Interval interval[200001];
long long answer[200001];
bool Solve(int n,int m){
priority_queue<Interval> myQueue;
int position=0; //当前区间下标
int number =0; //搭建桥的数目
for(int i=0;i<m;i++){
while(myQueue.top().maximum<bridge[i].length&&!myQueue.empty()){
myQueue.pop();//当前区间无法搭建
}
while(positon<n-1&&interval[position].minimum<=bridge[i].length
&&interval[position].maximum>=bridge[i].length){
myQueue.push(interval[position]);
position++;
}
if(!myQueue.empty()){
Interval current=myQueue.top();
myQueue.pop();
answer[current.index]=bridge[i].index;
number++;
}
}
return number== n-1;
}
int main(){
7
int n,m;
while(cin>>n>>m){
memset(island,0,sizeof(island));
memset(bridge,0,sizeof(bridge));
memset(interval,0,sizeof(interval));
memset(answer,0,sizeof(answer));
for(int i=0;i<n;i++){
cin>>island[i].left>>island[i].right;
}
for(int i=0;i<m;i++){
cin>>bridge[i].length;
bridge[i].index=i+1;
}
for(int i=0;i<n-1;i++){
interval[i].minimum=island[i+1].left-island[i].right;
interval[i].maximum=island[i+1].right-island[i].left;
interval[i].index=i;
}
sort(interval,interval+n-1,IntervalCompare);
sort(bridge,bridge+m,BridgeCompare);
if(Solve(n,m)){
cout<<"Yes"<<endl;
for(int i=0;i<n-1;i++)
cout<<answer[i]<<" ";
cout<<endl;
}
else cout<<"No"<<endl;
}
return 0;
}
6.To Fill or Not to Fill
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
struct station{
double price;
double dis;
bool operator <(const station &A)const{
return dis<A.dis;}
}; //加油站结构
int main(){
station buf[501];
int i,j,n;
double cmax,d,davg,maxdis,ans;
while(cin>>cmax>>d>>davg>>n){
ans=0;
maxdis=cmax*davg;
for(int i=0;i<n;i++)
cin>>buf[i].price>>buf[i].dis;
buf[n].dis=d;
sort(buf,buf+n);
if(buf[0].dis!=0){
cout<<"The maximum travel distance = 0.00"<<endl;
continue;
}
double curpos=0;
double curoil=0;
for(int i=0;i<n;i++){
curpos=buf[i].dis;
if(curpos+maxdis<buf[i+1].dis){
cout<<"The maximum travel distance = "<<
setiosflags(ios::fixed)<<setprecision(2)<<curpos+maxdis<<endl;
break;
}
if(i>0)
curoil-=(buf[i].dis-buf[i-1].dis)/davg;
double curdis=0;
bool ischeap=false;
for(j=i+1;j<n;j++){
curdis=buf[j].dis-buf[i].dis;
if(curdis>maxdis)break;
if(buf[j].price<buf[i].price){
double temp=(buf[j].dis-buf[i].dis)/davg;
if(temp>curoil){
ans+=(temp-curoil)*buf[i].price;
curoil=temp;
}
ischeap=true;
break;
}
}
if(!ischeap){
if(curpos+maxdis>=d){
ans+=((d-curpos)/davg-curoil)*buf[i].price;
cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;
break;
}
else{
ans+=(cmax-curoil)*buf[i].price;
curoil=cmax;
}
}
}
}
return 0;
}