UVA815

Posted torettorui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA815相关的知识,希望对你有一定的参考价值。

这道题主要学到的就是数据结构的组织,一些需要从小到大排列的东西,这些东西还有对应的东西。这个时候使用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块
",it->first,it->second->this_level);
         printf("海拔比%d低的有  %d块
",it->first,it->second->lower_level);
         printf("恰好没有淹没这个海拔时的所需水的体积%d
",it->second->cubic_meters);
         printf("
");
     }
 }

 void compute()
 {
     if(cubic_meter==0)
     {
         printf("Water level is %.2lf meters.
",(double)Map.begin()->first);
         printf("0.00 percent of the region is under water.
");
         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.
",water_level);
             printf("%.2lf percent of the region is under water.
",percent*100);
             return;
         }
     }
     it--;
     water_level=((double)cubic_meter-it->second->cubic_meters)/(row*col*100)+it->first;
      printf("Water level is %.2lf meters.
",water_level);
      printf("100.00 percent of the region is under water.
");

 }

 int main()
 {
#ifdef local
     freopen("input.txt","r",stdin);
     freopen("output.txt","w",stdout);
#endif
     int kase=0;
     while(initial())
     {
         printf("Region %d
",++kase);
         compute();
         printf("
");
        // print_map();
         //compute();
     }
     return 0;
 }

 

以上是关于UVA815的主要内容,如果未能解决你的问题,请参考以下文章

UVA815(洪水)。

刷题记录--UVa815 Flooded!

UVa 1442 - Cave

Codeforces Round #815 (Div. 2) 题解

LeetCode 815. Bus Routes

leetcode 815