uvA Flooded!
Description
Input
Output
Sample Input
3 3
25 37 45
51 12 34
94 83 27
10000
0 0
Sample Output
Region 1
Water level is 46.67 meters.
66.67 percent of the region is under water. 先对所有海拔排序,从小到大
然后,选取中间的海拔作为最终填满T1体积水后的海拔高度,判断其与T的关系,若T1>T,选取海拔较小的海拔,填满T2体积水。
直到得到两相邻海拔高度的T1,T2,使得(T1-T)*(T2-T)<0,则说明最后的水的高度在T1和T2之间。
考虑到数据个能比较多,采用二分法做该题。
但是,最后一直 结果错误,以下为采用二分法的错误代码
情况很多,细节也很多。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <iomanip>
using namespace std;
const int maxn = *+;
int s[maxn], sum[maxn],m,n; //s为各个网格的海拔高度,有正有负 void dataout(double a1,double a2,double ss,double numm,double T)
{
//cout<<a1<<" "<<a2<< " "<<ss<< " "<<numm<<endl;
if(numm == )numm=;
double height = ss + (a1 - a2) / numm , per;
if(T == )per=;
else per = * numm / (m*n) ;
cout<<setiosflags(ios::fixed)<<setprecision();
cout << "Water level is " << height << " meters."<<endl;
cout << per << " percent of the region is under water."<<endl;
} void deal2(double T)
{
sort(s, s + m * n);
int a = , b = n * m - ,mid; //用二分法从中间向两边计算
while(){
mid = (a + b) / ;
if(sum[mid]!=)sum[mid]=;
for(int i = ;i < mid; i++){
if(s[i] < s [mid]) {
sum[mid] += (s[mid] - s[i]);
}
}
if (sum[mid] < T) a = mid;
else b = mid;
if(abs(a-b)<=)break;
}
if((sum[a-]-T)*(sum[a]-T) < &&a!=){
if(sum[a-] > T) dataout(T,sum[a],s[a],a-,T);
else dataout(T,sum[a-],s[a-],a,T);
}
else{
if(sum[a+] > T) dataout(T,sum[a],s[a],a+,T);
else dataout(T,sum[a+],s[a+],a,T);
}
} void deal1(double T)
{
sort(s, s + m * n);
int i;
bool flag = false;
sum[] = ;
for(i=;i<n*m;i++){
for(int j=;j<i;j++){
sum[i]+=(s[i] - s[j]);
/*cout<<"i "<<i<<" j "<<j<<endl;
cout<<sum[i]<<" = "<<s[i]<<" - "<<s[j]<<endl;*/
}
if(sum[i] >= T){
flag = true;
break;
}
}
/*cout<<i<<endl;
cout<<"sum[i-1] "<<sum[0]<<" sum[i] "<<sum[1]<<endl;*/
if(flag){
double height ,per;
if(T == ){
per=;
height = s[];
}
else {
per = * i / m / n;
height = s[i-] + (sum[i] - sum[i-]) / i;
}
cout<<setiosflags(ios::fixed)<<setprecision();
cout << "Water level is " <<height << " meters."<<endl;
cout << per<<" percent of the region is under water."<<endl;
}
else{
i--;
/*cout<<"false"<<endl;
cout<<"i "<<i<<endl;
cout<<" s[i-1] "<<s[i-1]<<" sum[i] "<<sum[i]<<endl;*/
double height ,per;
if(T == ){
per = ;
height = s[];
}
else {
per = ;
height = s[i] + (T - sum[i]) / (i + ) ;
}
cout<<setiosflags(ios::fixed)<<setprecision();
cout << "Water level is " <<height << " meters."<<endl;
cout << per<<" percent of the region is under water."<<endl;
}
} int main()
{
int times=;
double T;
while( cin >> n >> m ){
if(n == )break;
for(int i = ;i < n*m;i++)cin >> s[i];
cin >> T;
cout<< "Region " << ++times << endl;
memset(sum,,sizeof(sum));
if(m == &&n == ){
double height = T/ + s[],per;
if(T == ) per = ;
else per = ;
cout << setiosflags(ios::fixed) << setprecision();
cout << "Water level is " <<height << " meters."<<endl;
cout << per << " percent of the region is under water."<<endl;
}
else if(m*n<)deal1(T/);
else deal2(T / );
}
return ;
}
实在不知错在哪,就不用二分法试试。
一次AC
果然还是我想太多了,不用二分法也并没有超时。
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
const int maxn = *+;
int s[maxn],m,n; //s为各个网格的海拔高度,有正有负 void dataout(double a1,double a2,double ss,double numm,double T)
{
if(numm == )numm=;
double height = ss + (a1 - a2) / numm , per = * numm / (m*n);
cout<<setiosflags(ios::fixed)<<setprecision();
cout << "Water level is " << height << " meters."<<endl;
cout << per << " percent of the region is under water."<<endl;
} void deal(double T)
{ int a = ,t1 = ,t2 = ,i;
for(i=;i<n*m;i++){
t2 = t1;
t1 = ;
for(int j=;j<i;j++)t1+=(s[i] - s[j]);
if(t2< T&& (t1 > T||t1 == T))break; }
if(i == n*m) dataout(T,t1,s[i-],i,T);
else dataout(T,t2,s[i-],i,T);
} int main()
{
int times=;
double T;
while( cin >> n >> m ){
if(n == )break;
for(int i = ;i < n*m;i++)cin >> s[i];
cin >> T;
cout<< "Region " << ++times << endl;
sort(s, s + m * n);
if(T == ){
double height = s[], per = ;
cout << setiosflags(ios::fixed) << setprecision();
cout << "Water level is " <<height << " meters."<<endl;
cout << per << " percent of the region is under water."<<endl;
}
else deal( T / );
}
return ;
}
uvA Flooded!的更多相关文章
- UVA 815 Flooded!
题意:来自:https://blog.csdn.net/lecholin/article/details/70186673 思路: ①数组存每个网格的高度,然后排序,做题时想象为上面的柱状图. ②注意 ...
- 【每日一题】Flooded! UVA - 815 模拟阅读格式题
https://cn.vjudge.net/problem/UVA-815 题意:给你一个矩阵,每个格子的数代表一个海拔并且每个格子的面积100平方米.给你整个区域的降水量(立方米),问降水量(米). ...
- 【习题 4-9 UVA - 815】Flooded!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目很迷啊. 不会出现盆地? 可以理解为一条线. 从左往右高度上升的一座座山. 然后V升的水从最左边的山倒进去. 然后问你最后海拔多 ...
- Flooded! UVA - 815 (sort排序)
错了好多遍,不知道为啥出错,如果有大神发现,请求指点!!! 附错误代码(错的不知道怎么回事): #include<iostream> #include<cstdio> #inc ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
随机推荐
- 基尔霍夫矩阵题目泛做(AD第二轮)
题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...
- git的安装已经连github
https://help.github.com/articles/generating-ssh-keys 1.安装git [plain] view plain copy sudo apt-get ...
- 利用JS实现HTML TABLE的分页
有时候table的列数太长,不利于使用者查询,所以利用JS做了一个table的分页,以下为相关代码 一.JS代码 <script type="text/javascript" ...
- The Love-Letter Mystery
def numOperations(testStr): num = 0 n = len(testStr) for i in range(n / 2): num += abs(ord(testStr[i ...
- Pyhon之常用操作符 - 零基础入门学习Python006
Pyhon之常用操作符 让编程改变世界 Change the world by program 今天我们来谈谈Python之常用操作符,在此之前的一些例子中,大家已经看到Python可以完成简单的算术 ...
- 一个人的旅行--hdu2066
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- VBS 操作注册表 十六进制
使用VBS操作注册表,通常使用RegRead/RegWrite/RegDelete方法,如: RegRead: 'read.vbs(将以下代码存为read.vbs文件) Dim OperationRe ...
- 安卓开发中ScrollView不能用RelativeLayout的解决方案
RelativeLayout的意义: 布局各个部件的相对布局.使得界面空间合理利用. 一.ScrollView局限: 滑动的只能是linearlayout,甚至整个布局都不能有RelativeLayo ...
- Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 下
上一篇中,介绍了如何编译.运行arm-linux-gdb 和 gdbserver,这一篇中介绍怎样结合Eclipse-cdt进行图形化编译调试 首先当然是使用CDT创建项目并添加源文件. 在左侧 Pr ...
- 游标的使用实例(Sqlserver版本)
游标,如果是之前给我说这个概念,我的脑子有二个想法:1.你牛:2.我不会 不会不是理由,更不是借口,于是便要学习,本人属性喜欢看代码,不喜欢看书的人,所以嘛,文字对我没有吸引力:闲话少说啊,给大家提供 ...