water1
Time Limit: 1000MS
Memory Limit: 65536KB
Description
听说全球气候变暖,冰川融化,海水淹大地。着实好奇要融化多少冰川会淹没我的宿舍,哦不,淹没南京,反正NJUST应该总会是第一批被淹的。
现将问题简化成一个二维坐标系的模型。有N个矩形块区域,每个区域有海拔(H)和宽度(W),区域按照顺序给出,比如有3个区域,第一个区域宽度为1,海拔为2,第二个区域宽度为5,海拔为6,第三个区域宽度为3,海拔为4,从图像上看就是像这样:(Y轴是海拔)
8
7
6 +++++
5 +++++
4 ++++++++
3 ++++++++
2 +++++++++
1 +++++++++
123456789
假设最左边和最右边都是无限高的墙。
为了简化问题,假设水流下来的速度是每秒一个单位的水,并且总是往区域一降水(某沿海地区)。
现在请问要淹没所有的区域至少要多少时间(秒)?淹没的定义是,所有的区域表面至少覆盖一层水。如果没有区域则至少要放一滴水。
上图例子中,淹没完如下:
8
7 wwwwwwwww
6 w+++++www
5 w+++++www
4 w++++++++
3 w++++++++
2 +++++++++
1 +++++++++
123456789
所以需要19秒。
Input
多CASE,测试数据以EOF结尾,对于每个CASE:
第一行一个整数N(0 <= N <= 10^5)。
接下去N行每行对应两个整数H(1 <= H <= 10^5),W(1 <= W <= 10^5)分别对应第N个区域的海拔和宽度。
Output
一个整数,表示所需要的时间。
Sample Input
3
2 1
6 5
4 3
Sample Output
19
这是最坑爹的一道题,命名非常简单,就是一个球面积的问题,可以一直卡在这里过不去,哎,全是泪……………………
解题思路:直接计算即可。
附上我的WA代码,和向别人要的AC代码,至少我是没感觉有什么区别………………
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int H[100010];
int W[100010];
int wight=0;
while(cin>>n)
{
if(n==0)
cout<<1<<endl;
else
{
for(int i=0;i<n;i++)
cin>>H[i]>>W[i];
int m_2=0;
for(int k=0;k<n;k++)
m_2+=(H[k]*W[k]);
sort(H,H+n);
int high=H[n-1]+1;
for(int j=0;j<n;j++)
wight+=W[j];
int m=wight*high;
// cout<<"high"<<high<<"wight"<<wight<<endl;
// cout<<"m"<<m<<"m_2"<<m_2<<endl;
cout<<m-m_2<<endl;
}
}
return 0;
}
我的WA代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n;
long long sum=0;
long long sub=0;
int h[100005];
int w[100005];
while(cin>>n)
{
if(n==0)cout<<1<<endl;
else
{
sub=0;
sum=0;
int weight=0;
int height=0;
for(int i=0;i<n;i++)
cin>>h[i]>>w[i];
for(int i=0;i<n;i++)
{
weight+=w[i];
sub+=w[i]*h[i];
}
sort(h,h+n);
height = h[n-1]+1;
sum=weight*height;
// cout<<sum<<endl;
//cout<<sub<<endl;
sum-=sub;
cout<<sum<<endl;
}
}
return 0;
}
开始的时候没用数组,直接计算,原理和这份代码一样,看了他的代码之后就也用了数组,可是还是WA!!!真的要疯了