ACM ICPC 2017 Warmup Contest 4(ACM Northeastern European Regional Contest,Northern Subregion 2015)

43 篇文章 0 订阅
17 篇文章 0 订阅

返校后的第一场,来看看三道水题

A. Alex Origami Squares

思路:将一个矩形内分割出三个同样大小的正方形,由于同样大小和并且是边长相同的正方形而且确定了数目为三个,那么一切都变得简单了,三个正方形只有1*3,2*2,3*1三种摆法,将这三种取个最大值即可

 

/*
Author Owen_Q
*/

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

int main()
{
    int h,w;
    while(scanf("%d%d",&h,&w)!=EOF)
    {
        double dh = h;
        double dw = w;
        double d1 = min(dw,dh/3);
        double d2 = min(dh,dw/3);
        double d12 = max(d1,d2);
        double d3 = min(dw/2,dh/2);
        double dd = max(d12,d3);
        printf("%.6lf\n",dd);
    }
    return 0;
}

 


 L. Lucky Chances

思路:又是一个遍历搜索的问题,一开始把数据范围看错了,一维是1e3的于是直接将自己想到的O(n^3)的算法否定了,想着先O(n^2)预处理每个位置四个方向的最大值,即是否可以取该方向,然后再O(n^2)判断一遍,后来发现数据范围只有1e2,O(n^3)的暴力也完全可以,其实也无妨,写个预处理也并没有花费太多时间,就这样吧,反正过了就好

 

/*
Author Owen_Q
*/

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e3+10;

int l[maxn][maxn];
bool up[maxn][maxn];
bool down[maxn][maxn];
bool rig[maxn][maxn];
bool lef[maxn][maxn];

int main()
{
    int r,c;
    while(scanf("%d%d",&r,&c)!=EOF)
    {
        memset(up,false,sizeof(up));
        memset(down,false,sizeof(down));
        memset(rig,false,sizeof(rig));
        memset(lef,false,sizeof(lef));
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                scanf("%d",&l[i][j]);
            }
        }
        for(int i=0;i<r;i++)
        {
            int maxl = 0;
            for(int j=0;j<c;j++)
            {
                if(l[i][j]>maxl)
                {
                    lef[i][j] = true;
                    maxl = l[i][j];
                }
            }
            maxl = 0;
            for(int j=c-1;j>=0;j--)
            {
                if(l[i][j]>maxl)
                {
                    rig[i][j] = true;
                    maxl = l[i][j];
                }
            }
        }
        for(int j=0;j<c;j++)
        {
            int maxl = 0;
            for(int i=0;i<r;i++)
            {
                if(l[i][j]>maxl)
                {
                    up[i][j] = true;
                    maxl = l[i][j];
                }
            }
            maxl = 0;
            for(int i=r-1;i>=0;i--)
            {
                if(l[i][j]>maxl)
                {
                    down[i][j] = true;
                    maxl = l[i][j];
                }
            }
        }
        int sum = 0;
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                if(up[i][j])
                {
                    sum++;
                }
                if(down[i][j])
                {
                    sum++;
                }
                if(lef[i][j])
                {
                    sum++;
                }
                if(rig[i][j])
                {
                    sum++;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

 


E. Easy Arithmetic

 

思路:这是一个细节题,改写数学表达式,可以合法地添加任意符合使表达式值最大,那么思路很简单,“+”后面肯定不用动,毕竟越加越大,“-”后面肯定要填“+”,一开始想了好多细节,后来发现越细越容易出错,越容易有疏漏,归一化处理,才会比较容易考虑全面。

 

 

最后的思路就是,寻找到“-”,在“-”后面第二个数字开始计算,找到第一个不为0的数,在该数和其前面的0前都添加“+”就可以了,如此归一化成一个完整操作,注意一下全0的提前终止就好了,最后,一定要注意char型字符‘0’和整型数字0的区别,确实有坑

 

/*
Author Owen_Q
*/

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

char s[maxn];
bool add[maxn];

int main()
{
    while(scanf("%s",s)!=EOF)
    {
        memset(add,false,sizeof(add));
        int len = strlen(s);
        for(int sta=0;sta<len;sta++)
        {
            if(s[sta] == '-')
            {
                int pos = sta+1;
                if(pos==len-1)
                {
                    break;
                }
                else if(s[pos+1]>='0'&&s[pos+1]<='9')
                {
                    while(pos+1<len&&s[pos+1]=='0')
                    {
                        pos++;
                        add[pos] = true;
                    }
                    if((pos+1 < len) && (s[pos+1]>'0')&& (s[pos+1] <= '9'))
                    {
                        //cout << pos <<"*"<< endl;
                        //cout << s[pos+1] << endl;
                        //cout <<  (s[pos+1]>'0')<<"*"<< (s[pos+1] <= '9') << endl;
                        add[pos+1] = true;
                        pos++;
                    }
                }
                sta = pos;
            }
        }
        for(int p=0;p<len;p++)
        {
            if(add[p])
            {
                printf("+");
            }
            printf("%c",s[p]);
        }
        printf("\n");
    }
    return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值