王道考研复试机试题解 2020版--第七章贪心策略

第七章 贪心策略

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;
} 
发布了49 篇原创文章 · 获赞 11 · 访问量 7617

猜你喜欢

转载自blog.csdn.net/mid_Faker/article/details/104605467