这道题主要学到的就是数据结构的组织,一些需要从小到大排列的东西,这些东西还有对应的东西。这个时候使用map可以解决
下面贴出代码。其中所使用的思想,估计这个东西是没法学的,这就只能是灵感
//这是什么吉尔题,题意都没有说清楚,排水系统保证从最低的开始,而且四面都是高地 //我想要的数据结构是,从小到大把海拔排序,每个海拔对应=这个海拔的块数,以及比这个海拔低的块数 //最后计算的时候,可以很容易的计算出快要淹没这个海拔时所需要的体积,海拔差*比这个海拔低的块数 #include<cstdio> #include<map> using namespace std;struct square{int this_level;int lower_level;int cubic_meters;};map<int,square*>Map;int row,col;int cubic_meter;bool initial(){Map.clear();scanf("%d%d",&row,&col);if(!row){return false;}for(int i=0;i<row*col;i++){int level;scanf("%d",&level);if(!Map.count(level)){Map[level]=new square;Map[level]->this_level=1;}else{Map[level]->this_level++;}}scanf("%d",&cubic_meter);}void print_map(){for(map<int,square*>::iterator it=Map.begin();it!=Map.end();it++){printf("海拔%d的有 %d块\n",it->first,it->second->this_level);printf("海拔比%d低的有 %d块\n",it->first,it->second->lower_level);printf("恰好没有淹没这个海拔时的所需水的体积%d\n",it->second->cubic_meters);printf("\n");}}void compute(){if(cubic_meter==0){printf("Water level is %.2lf meters.\n",(double)Map.begin()->first);printf("0.00 percent of the region is under water.\n");return;}//先将恰好没有埋没每块土地时,所需的水的体积计算出来int lower=0;for(map<int,square*>::iterator it=Map.begin();it!=Map.end();it++){it->second->lower_level=lower;lower=lower+it->second->this_level;}int lower_level=0,lower_cube=0;for(map<int,square*>::iterator it=Map.begin();it!=Map.end();it++){it->second->cubic_meters=it->second->lower_level*(it->first-lower_level)*100+lower_cube;lower_level=it->first;lower_cube=it->second->cubic_meters;}double water_level,percent;map<int,square*>::iterator it=Map.begin();for(;it!=Map.end();it++){if(it->second->cubic_meters>=cubic_meter){percent=(double)it->second->lower_level/(row*col);water_level=it->first-(it->second->cubic_meters-(double)cubic_meter)/(it->second->lower_level*100);printf("Water level is %.2lf meters.\n",water_level);printf("%.2lf percent of the region is under water.\n",percent*100);return;}}it--;water_level=((double)cubic_meter-it->second->cubic_meters)/(row*col*100)+it->first;printf("Water level is %.2lf meters.\n",water_level);printf("100.00 percent of the region is under water.\n");}int main(){ #ifdef localfreopen("input.txt","r",stdin);freopen("output.txt","w",stdout); #endifint kase=0;while(initial()){printf("Region %d\n",++kase);compute();printf("\n");// print_map();//compute(); }return 0;}