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

来源:互联网 发布:嗨氏黑历史知乎 编辑:程序博客网 时间:2024/05/24 01:50

返校后的第一场,还是只做了三题水题,对于字符串,又放弃了,趁这段时间还是得看看,虽然不主攻这方面,但做一个完全盲,无法与队友交流也不好啊

先看看这三个水题吧

A. Alex Origami Squares

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

#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)的暴力也完全可以,其实也无妨,写个预处理也并没有花费太多时间,就这样吧,反正过了就好

#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的区别,确实有坑

#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;}

文章地址:http://blog.csdn.net/owen_q/article/details/78171645

阅读全文
1 0
原创粉丝点击