最近学习算法,同学出了一个打怪练级的题目,虽然花了很长时间才做出来,感觉很有收获,下面把题目与我的 解答列出
题目
打怪练级
(level.pas/c/cpp)
【问题描述】
路路最近比较喜欢玩魔兽争霸,其中的一个rpg地图难住了他。这个地图的规则是你控制着一名初始等级为p 的英雄,地图上有n个怪 ,每个怪都有它固定的等级和经验值,加入你的英雄的等级大于等于怪的等级,那么你就可以将它一击必杀并获得相应的经验,每一点经验都会使你的英雄提升一级 。反之,如果怪的等级比你高,它就会秒杀你。你的任务是帮助路路从这n只怪里挑出最多m只 ,利用这些怪所能达到的最大等级。
【输入文件】
输入文件 level.in 第一行有3个整数n、m、p,接下来n行每行有2个 整数,分别代表每只怪的等级和可获得的经验。
【输出文件】
输出文件level .out 包括1个整数,是能达到的最大等级。
【输入样例1】
2 2 1
1 2
7 3
【输出样例1】
3
【输入样例2】
3 1 2
1 2
2 3
3 4
【输出样例2】
5
【数据 规模】
对于30% 的数据,保证n <= 100, m <= 100 。
对于60% 的数据,保证n <= 100000, m <= 100 。
对于100% 的数据,保证n <= 100000, m <= 100000 。
我的解答
#include #include #include #define MAX_SIZE 100000 void max_heapify(int *m,int *n,int i,int size){ //以m排序,同时对n进行同步 int l,r,largest,temp; l = 2*i; r = 2*i+1; if(l<=size && m[l] > m[i]) largest=l; else largest=i; if(r<=size && m[r] > m[largest]) largest=r; if(largest != i){ temp=m[i]; m[i]=m[largest]; m[largest]=temp; temp=n[i]; n[i]=n[largest]; n[largest]=temp; max_heapify(m,n,largest,size); } } void build_max_heap(int *m,int *n,int size){ int i; for(i=size/2;i>=1;i--){ max_heapify(m,n,i,size); } } void heapify(int *m,int *n,int size){ int i,temp; i=size; while(i>1 && m[i/2] < m[i]){ temp=m[i]; m[i]=m[i/2]; m[i/2]=temp; temp=n[i]; n[i]=n[i/2]; n[i/2]=temp; i=i/2; } } void kuaipai(int *dengji,int *jingyan,int p,int r){ int q,i,j,temp; i=p;j=r; q=dengji[(p+r)/2]; do{ while(dengji[i]q) j--; if(i<=j){ temp=dengji[i]; dengji[i]=dengji[j]; dengji[j]=temp; temp=jingyan[i]; jingyan[i]=jingyan[j]; jingyan[j]=temp; i++; j--; } }while(i<=j); if(ip) kuaipai(dengji,jingyan,p,j); } void dayin(int *m,int n){ int i; for(i=1;i<=n;i++){ printf("%d ",m[i]); } } int main(){ clock_t begin, end; double cost; begin = clock(); int dengji[MAX_SIZE]; int jingyan[MAX_SIZE]; int td[MAX_SIZE]; int tj[MAX_SIZE]; int n,m,p,i,shuju_size,t_size; int x,temp;//x指向最后挑出的可以打的怪的下一个怪 FILE *fin,*fout; fin=fopen("level10.in","rb"); fscanf(fin,"%d%d%d",&n,&m,&p); //n只怪,挑出m只,等级为p shuju_size = n; for(i = 1;i <= n;i++){ fscanf(fin,"%d %d",&dengji[i],&jingyan[i]); } kuaipai(dengji,jingyan,1,n); i=1; while(dengji[i] <= p){ td[i]=dengji[i]; tj[i]=jingyan[i]; i++; } x=i; t_size = x-1; build_max_heap(tj,td,t_size); for(i=1;i<=m;i++){ if(t_size == 0) break; p=p+tj[1]; temp=td[1]; td[1]=td[t_size]; td[t_size]=temp; temp=tj[1]; tj[1]=tj[t_size]; tj[t_size]=temp; t_size--; max_heapify(tj,td,1,t_size); while(dengji[x]<=p){ t_size++; td[t_size]=dengji[x]; tj[t_size]=jingyan[x]; x++; heapify(tj,td,t_size); } } fout=fopen("level.out","wb"); fprintf(fout,"%d /r/n",p); end = clock(); cost = (double)(end - begin) / CLOCKS_PER_SEC; fprintf(fout,"%lf seconds",cost); return 0; }