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 ...
随机推荐
- 虚函数—c++的灵魂
<note_content /> 虚函数 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数 ...
- oracle RAC调整数据文件大小并移动表到指定的表空间
一.Oracle RAC 调整表空间数据文件大小 1.先查找出表空间对应的数据文件路径: select file_name,tablespace_name from dba_data_files ; ...
- 关于Repeater中绑定的控件不触发ItemCommand事件
今天遇到 在repeater 中使用一个button,点击button然后跳转另外一个页面. html. <asp:Repeater ID="repeater" runat= ...
- 用python随机生成数据,再插入到postgresql中
用python随机生成学生姓名,三科成绩和班级数据,再插入到postgresql中. 模块用psycopg2 random import random import psycopg2 fname=[' ...
- iOS学习之界面间传值
/** * 界面间传值步骤 1.界面传值第一种场场景:从前往后传值. 秘诀:属性传值.(葵花宝典). 招式:(1).在后一个界面定义属性,属性的类型和传出数据类型一致. (2).在进入下一界面之前, ...
- hdu 5305Friends
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 Problem Description There are n people and m pai ...
- LoadRunner利用ODBC编写MySql脚本
最近做了几周的LoadRunner测试,有一些心得,记录下来,以便以后查找. LoadRunner测试数据库是模拟客户端去连接数据库服务器,因此,需要协议(或者说驱动的支持).LoadRunner本身 ...
- C语言日期时间标准库
用思维导图整理: 代码: #include <stdio.h> #include <time.h> #include <string.h> int main() { ...
- PowerShell常用的属性
get-location | get-member -membertype property -------获取对象的属性---------- 获取对象特定的成员, 湖区.Net Framwork ...
- Windows搭建SMTP邮件服务器
From:http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e4cf06f5-9a36-474b-b ...