Summer day 3

早上没啥事,分析下昨天一直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;
}

首先讲思路。这是一道模拟/数学题,实现起来并不难,但是边界和特殊情况要细心考虑。

  1. 读入。
  2. 初始化,排序。既然水位平,就可以排序解。
  3. 用循环找临界的块。
    具体找法就是利用高度差之和(sum_delta_h)乘100来逐个记录体积在比较,具体操作见solve()。
  4. 输出。

    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的题解。三点一线生活基本形成,希望周末能有个大改变(误)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值