早上没啥事,分析下昨天一直WA的题目,结果还是WA,没明白为啥。
Uva815 洪水
题目大意 给出区域(Region)的长,宽,以10m为单位,再给出各块海拔和洪水体积,求洪水水位高度。区域四周无限高,因此可能出现100%覆盖区域的情况。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double a[1001];
double vol;
int n, m;
void solve()
{
double sum_delta_h = 0, rate, hi, prev;
int flag = 0;
for(int i = 1; i<n*m; i++)
{
sum_delta_h += (a[i]-a[i-1])*double(i);
if(sum_delta_h*100.>=vol)
{
flag = 1;
prev = (sum_delta_h - (a[i]-a[i-1])*double(i))*100.;
rate = double(i*100.0)/double(n*m);
hi = (vol - prev)/(100*i);
hi = hi+a[i-1];
break;
}
}
if(flag == 0)
{
hi = (vol - sum_delta_h)/(100*n*m);
hi = hi+a[n*m-1];
rate = 100.0;
}
printf("Water level is %.2lf meters.\n%.2lf percent of the region is under water.\n",hi, rate);
}
int main()
{
int kase = 0;
while(scanf("%d%d",&m, &n)!=EOF)
{
if(m+n == 0)
break;
for(int i = 0; i<n*m; i++)
scanf("%lf", &a[i]);
scanf("%lf",&vol);
sort(a, a+n*m);
printf("Region %d\n",++kase);
solve();
printf("\n");
memset(a, 0, sizeof(a));
}
return 0;
}
首先讲思路。这是一道模拟/数学题,实现起来并不难,但是边界和特殊情况要细心考虑。
- 读入。
- 初始化,排序。既然水位平,就可以排序解。
- 用循环找临界的块。
具体找法就是利用高度差之和(sum_delta_h)乘100来逐个记录体积在比较,具体操作见solve()。 输出。
Uva 253 Cube painting
给出两个着三色的立方体,判断是否等价(即旋转)。
这道题昨天没有A,代码很长最后没耐心调试,觉得这样做效率好低。今天看了看题解,发现一个简洁高效的解法,当时我没有震惊。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=20;
char str[N],str1[N],str2[N];
int dir[6][6]={ {0,1,2,3,4,5},{1,5,2,3,0,4},{2,1,5,0,4,3},{3,1,0,5,4,2},
{4,0,2,3,5,1},{5,4,2,3,1,0} };
bool fun();
int main()
{
while(scanf("%s",str)!=EOF)
{
for(int i=0;i<6;i++) str1[i]=str[i];
for(int i=0;i<6;i++) str2[i]=str[i+6];
if(fun()) puts("TRUE");
else puts("FALSE");
}
return 0;
}
bool fun()
{
char temp[N]={0};
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
temp[j]=str1[dir[i][j]];
}
for(int j=0;j<4;j++)
{
char cha;
cha=temp[1];
temp[1]=temp[2];
temp[2]=temp[4];
temp[4]=temp[3];
temp[3]=cha;
if(strcmp(temp,str2)==0) return true;
}
}
return false;
}
这个数组用的很精妙,表示了把各个面旋转到第一面时其他面的分布,再进行旋转比对。
我今天果然和WA有缘,下午练习赛又是一道死活过不了的WA,HDU 5578,青蛙的朋友。状态查找不好维护。
HDU 5538,配了个MC的图,并不能改变这道题的狗血背景。 求给出立方堆积的表面积。
一次过。思路是对每个坐标求它与隔壁的差来确定它“拥有”的面积,同时从(1,1)开始让边界不用再判断了。
#include<cstdio>
#include<cstring>
int map[55][55];
int n, m;
int check(int i, int j)
{
int area = 0;
if(map[i][j]-map[i-1][j]>0)
area+=(map[i][j]-map[i-1][j]);
if(map[i][j]-map[i+1][j]>0)
area+=(map[i][j]-map[i+1][j]);
if(map[i][j]-map[i][j+1]>0)
area+=(map[i][j]-map[i][j+1]);
if(map[i][j]-map[i][j-1]>0)
area+=(map[i][j]-map[i][j-1]);
if(map[i][j]>0)
area++;
return area;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int ans = 0;
memset(map, 0, sizeof(map));
scanf("%d%d",&n, &m);
for(int i = 1; i<=n; i++)
for(int j = 1; j<=m; j++)
scanf("%d",&map[i][j]);
for(int i = 1; i<=n; i++)
for(int j = 1; j<=m; j++)
{
ans+=check(i, j);
}
printf("%d\n",ans);
}
return 0;
}
晚上准备看看书和WA的题解。三点一线生活基本形成,希望周末能有个大改变(误)。