Asce's Summer Ranking No.3

来源:互联网 发布:英菲克爬山虎软件下载 编辑:程序博客网 时间:2024/05/19 22:44
时间限制 1000 ms 内存限制 65536 KB

题目描述

学姐的七段数码管玩的出神入化。 现在给你一个浮点数,你需要把它以七段数码管的形式输出出来。 一个(2n+1)n的矩阵来表示七段数码管,若下标均从0开始,则以第0列的两个,第n1列的两个,第0行的一个,第n行的一个,第2n行的一个表示七个段。小数点所占矩形为(2n+1)1,点在中间最下面一列。每一个数字或小数点矩阵用一列空格隔开。 数码管亮的部分用#覆盖,其余部分用空格补全,若一个数字或小数点的行末尾无#,也要用空格字符补全为(2n+1)n 细节参见样例。

输入格式

输入有多组数据,数据不超过100组,每组数据给一个整数n(3n10),和一个浮点数,输入保证每一个浮点数的总长度为4位且没有前导0。

输出格式

输出他的数码管显示。每组数据末尾输出一个空行。

输入样例

3 23303 14564 78.9

输出样例

### ### ### ###  #   #   # # #  #   #   # # #### ### ### # ##     #   # # ##     #   # # #### ### ### ###  # # # ### ###  # # # #   #    # # # #   #    # ### ### ###  #   #   # # #  #   #   # # #  #   # ### ####### ####   ####   # #  #   #  #   # #  #   #  #   # #  #   #  #   # ####   ####   # #  #      #   # #  #      #   # #  #      #   # #### # ####


水题,每输入一个数据就case一下,把对应的数字形状打出来
注意细节处理
还有每两个样例间输出空行,注意读题

#include <iostream>#include <cstdio>#include <cstring>#define maxn 70 using namespace std; char a[maxn][maxn]; int n,Dex;char s[10];int main(){    while(~scanf("%d%s",&n,s))    {        for(int i=0;i<=65;i++)            for(int j=0;j<=65;j++) a[i][j]=' ';        Dex=0;        for(int i=0;i<=3;i++)        {            switch(s[i])            {            case '0':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[2*n][Dex+j]='#';} for(int j=0;j<=2*n;j++){a[j][Dex]='#';a[j][Dex+n-1]='#';} Dex+=n+1;break;}            case '1':{for(int j=0;j<=2*n;j++){a[j][Dex+n-1]='#';} Dex+=n+1;break;}            case '2':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[n][Dex+j]='#';a[2*n][Dex+j]='#';} for(int j=0;j<=n;j++){a[j][Dex+n-1]='#';} for(int j=n;j<=2*n;j++){a[j][Dex]='#';} Dex+=n+1;break;}            case '3':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[n][Dex+j]='#';a[2*n][Dex+j]='#';} for(int j=0;j<=2*n;j++){a[j][Dex+n-1]='#';} Dex+=n+1;break;}            case '4':{for(int j=0;j<=2*n;j++){a[j][Dex+n-1]='#';} for(int j=0;j<=n;j++){a[j][Dex]='#';}for(int j=0;j<=n-1;j++){a[n][Dex+j]='#';} Dex+=n+1;break;}             case '5':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[n][Dex+j]='#';a[2*n][Dex+j]='#';} for(int j=0;j<=n;j++){a[j][Dex]='#';}for(int j=n;j<=2*n;j++){a[j][Dex+n-1]='#';}Dex+=n+1;break;}            case '6':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[n][Dex+j]='#';a[2*n][Dex+j]='#';}for(int j=0;j<=2*n;j++){a[j][Dex]='#';}for(int j=n;j<=2*n;j++){a[j][Dex+n-1]='#';}Dex+=n+1;break;}            case '7':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';}for(int j=0;j<=2*n;j++){a[j][Dex+n-1]='#';}Dex+=n+1;break;}            case '8':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[n][Dex+j]='#';a[2*n][Dex+j]='#';}for(int j=0;j<=2*n;j++){a[j][Dex]='#';a[j][Dex+n-1]='#';}Dex+=n+1;break;}            case '9':{for(int j=0;j<=n-1;j++){a[0][Dex+j]='#';a[n][Dex+j]='#';a[2*n][Dex+j]='#';}for(int j=0;j<=2*n;j++){a[j][Dex+n-1]='#';}for(int j=0;j<=n;j++){a[j][Dex]='#';}Dex+=n+1;break;}            case '.':{a[2*n][Dex]='#';Dex+=2;break;}             }       }       for(int i=0;i<=2*n;i++)       {           for(int j=0;j<=Dex-2;j++) printf("%c",a[i][j]);           printf("\n");       }       printf("\n");     }     return 0;}

-----------------------------------------------------------------------------------
时间限制 1000 ms 内存限制 65536 KB

题目描述

学姐在学图形学,然后写了一个能让图片逆时针转圈的程序。这个程序很厉害,只要输入灰度图片和旋转过的角度(90的倍数),就可以输出一个新图片。给你一张图片的灰度矩阵,和它已转过的角度,请输出图片旋转前的灰度图矩阵。

输入格式

接下来给出图片扫描稿的高H和宽W,图片的灰度矩阵,高宽都小于500,题目其他的所有数值都小于int的范围。多组数据,组数小于20,EOF结束。

输出格式

一个矩阵

输入样例

2 2 1800 11 2

输出样例

2 11 0
也是水题,简单的旋转图像
注意角度不一定小于360度

#include <iostream>#include <cstdio>#define maxh 505 using namespace std; int a[maxh][maxh];int h,w,degree;int main(){    while(~scanf("%d%d%d",&h,&w,°ree))    {        for(int i=1;i<=h;i++)            for(int j=1;j<=w;j++) scanf("%d",&a[i][j]);        degree=degree%360;        switch(degree)        {        case 0:{                  for(int i=1;i<=h;i++)                  {                      for(int j=1;j<w;j++) printf("%d ",a[i][j]);                      printf("%d\n",a[i][w]);                  }                  break;               }        case 90:{                  for(int j=1;j<=w;j++)                  {                      for(int i=h;i>1;i--) printf("%d ",a[i][j]);                      printf("%d\n",a[1][j]);                  }                  break;               }        case 180:{                  for(int i=h;i>=1;i--)                  {                      for(int j=w;j>1;j--) printf("%d ",a[i][j]);                      printf("%d\n",a[i][1]);                  }                  break;               }        case 270:{                  for(int j=w;j>=1;j--)                  {                      for(int i=1;i<h;i++) printf("%d ",a[i][j]);                      printf("%d\n",a[h][j]);                  }                  break;               }         }    }    return 0;}

--------------------------------------------------------------
时间限制 2000 ms 内存限制 512000 KB

题目描述

维护一个字符串集合:初始为空,依次处理一些插入操作,并在插入之后输出该字符串在集合中出现的次数。

字符串的长度不超过100,字符串个数不超过100000。

输入格式

输入文件包含若干行,每行为一个字符串,依次代表一个待插入的字
符串。该字符串一定非空,且仅包含英文字母和数字。

输出格式

对于每个插入操作输出一行一个整数,代表插入该字符串之后,该字
符串在集合中出现的次数。

输入样例

str1str2str1str1str2str3

输出样例

112321
字串判重,数个数
就是个裸字典树有木有!!!!
可是,wzt菊苣出的数据专卡字典树。。。
于是我怒交了三个runtime error。。
最后用map水过了。。。
(简直丧病。。
注意,map的pair里存字符串要用string类,但直接cin string会超时
我是scanf的char[],再用assign函数转成string类。。
还有多种处理办法见whn神犇blog
#include <iostream>#include <map>#include <cstdio>#include <string>#include <cstring> using namespace std; map<string,int> mm; string temp;char temp0[105];int len;int main(){    mm.clear();    while(~scanf("%s",temp0))    {        len=strlen(temp0);        temp.assign(temp0,len);        if(mm.count(temp)==0)        {            mm.insert(pair<string,int>(temp,1));            printf("1\n");        }        else        {            mm.find(temp)->second++;            printf("%d\n",mm.find(temp)->second);        }    }    return 0;}


其实,这题应该用hash来解决0.0
学到了hash函数怎么求
然后,hash处理冲突有两种方法
一是在相应位置开一个vector存所有冲突的hash值
二是从冲突的位置往后搜,找到空位了,就插入
个人比较虚vector数据太大了会超空间。。
就用第二种方法a了一发
注意存hash值一定要用unsigned long long,不unsigned的话有负数,会runtime error。。
#include <iostream>#include <cstdio>#include <cstring>#define LL unsigned long long using namespace std; LL Get_hash(char a[]){    int len=strlen(a);    LL seed=13;    for (int i=0;i<=len-1;i++)    {        seed+=a[i];        seed*=13;    }    return seed;} char temp[105]; LL hashs[1000000];int Num[1000000];int main(){    memset(hashs,0,sizeof(hashs));    memset(Num,0,sizeof(Num));    while(~scanf("%s",temp))    {        LL Hs=Get_hash(temp);        int Mo=Hs%900000;         int i;        for(i=Mo;hashs[i]!=0 &&i<=999999;i++)        {            if(hashs[i]==Hs) {Num[i]++;printf("%d\n",Num[i]);break;}        }        if(hashs[i]==0)        {            hashs[i]=Hs;            Num[i]++;            printf("%d\n",Num[i]);        }     }    return 0;}

---------------------------------------------------------------------------------
时间限制 1000 ms 内存限制 65536 KB

题目描述

田田申请了一个新的oj账号,打算取一个霸气而简单的名字。 什么叫简单呢?说白了田田脑子不好使,只能记住abcd这4个字母组成单词。 怎么叫霸气呢?田田认为a个个数一定要有奇数个,b的个数一定要有偶数个(包括0)才可以。 现在田田取了一个长为n的账号,但是由于田田的记性实在太差了,而把账号忘记了. 于是把这个问题交给了聪明的wzt,而他认为这道题太过于简单就把这道题交给了你 究竟这个账号有多少种可能?你只需得到这个结果模109+7的值

输入格式

多组case,第一行为case数T,之后T行每行一个整数n。 1n109T100

输出格式

一个case对应一行输出

输入样例

212

输出样例

14
比赛进行到一半时候,忽然好多的人a掉了这题
嗯....说明是个水题诶。
通过前几组数据猜测,结果是4的幂
(这时,我估计了一下他们交题的时间,估计也就是打一个快速幂够用嘛。。
所以,十有八九是这么水过去的
于是速打一快速幂交了,就这么过了。。。。
证明的话,求数学菊苣带我0.0(又想@黄学姐了。。

#include <iostream>#include <cstdio>#define moo 1000000007 using namespace std; long long pow_mod(long long a,long long i,long long n){    if(i==0) return 1%n;    long long temp=pow_mod(a,i>>1,n);    temp=temp*temp%n;    if(i&1) temp=temp*a%n;    return temp;}int t,nn;int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d",&nn);        printf("%lld\n",pow_mod(4,nn-1,moo));    }    return 0;}

----------------------------------------------------------------------
时间限制 5000 ms 内存限制 65536 KB

题目描述

定义一颗平衡二叉树满足条件:对于任意节点,其左子树的权值之和等于右子树权值之和。如图:

我们用序列表示上图平衡二叉树,即4 1 1 2 4 4。
现在给定一个序列,求其能最长的能构成平衡二叉树的子序列。子序列元素为原序列的子集,且元素间保持原顺序。

输入格式

输入第一行为数据组数T(T10),接下来T组数据,每组第一行n(1n128)为序列元素个数,下一行给出n个正整数,ai(ai7)表示第i个数为2^ai

输出格式

每组数据输出一行,符合题意的最长子序列的长度。

输入样例

262 0 0 1 2 250 0 0 0 0

输出样例

64
比赛最后半小时看的这题,一着急读错题了以为子序列必须得连续。。。
于是石子合并模型一打,就wa了。。

设dp[i][j][k]表示区间i到j,前k层(从叶子节点开始)最多有多少节点
则枚举分点mid,dp[i][j][k]=max(dp[i][j][k],dp[i][mid][k-1]+dp[mid+1][j][k-1]);
输入的a[i]序列中的数越小,离根越远
而且由2的n次方性质,大小差1的数,在树中一定位于相邻的层
于是直接初始化第a[i]层为1

#include <iostream>#include <cstdio>#include <cstring> using namespace std; int t,n;int a[130];int dp[130][130][20];int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);         memset(dp,0,sizeof(dp));         for(int i=1;i<=n;i++)            for(int j=i;j<=n;j++)              for(int k=i;k<=j;k++)                dp[i][j][a[k]]=1;         for(int k=1;k<=20;k++)            for(int i=1;i<=n;i++)               for (int j=i;j<=n;j++)                  for(int mid=i;mid<j;mid++)                  if(dp[i][mid][k-1]!=0 && dp[mid+1][j][k-1]!=0)                  dp[i][j][k]=max(dp[i][j][k],dp[i][mid][k-1]+dp[mid+1][j][k-1]);       int ans=0;        for(int k=1;k<=20;k++)            for(int i=1;i<=n;i++)               for (int j=i;j<=n;j++)                ans=max(ans,dp[i][j][k]);         printf("%d\n",ans);    }    return 0;}

还有用位运算优化的版本,蒟蒻没看懂。。代码见whn神犇的blog



=================================EOF==============================================

0 0
原创粉丝点击