北邮新生排位赛1解题报告d-e

话说cdsn要是前面插入源代码又什么都不放就会出现奇怪的源代码?不知道是哪个网页的

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

题目描述

给定一个NM的矩阵,求问里面有多少个由'#'组成的矩形,"There are 5 ships.",若是里面有一个不是矩形的联通块,则输出"So Sad"

输入格式

1n,m1000

有多组数据,EOF结束。

输出格式

每行对应一个answer

输入样例

6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#

输出样例

There are 5 ships.
So Sad
好孩子们都用的bfs,不过因为时间足够所以我直接水过了

#include <cstdio>
using namespace std;
int len[1000][1000];
int width[1000][1000];
int readchar(){//just want to sleep
    while(1){
    char ch=getchar();
    if(ch=='#')return 1;
    if(ch=='.')return 0;
    if(ch==EOF)return -1;
    }
}
int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)==2){
        for(int i=0;i<n;i++){
            int l=0;
            for(int j=0;j<m;j++){
                int chsign=readchar();
                if(chsign==0){
                    len[i][j]=0;
                    l=0;
                }
                else if(chsign==1){
                    len[i][j]=l+1;
                    l++;
                }
            }
        }
        bool ans=true;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(len[i][j]==0){
                    width[i][j]=0;
                    if(i&&len[i-1][j]&&j&&len[i][j-1]){
                        ans=false;
                        break;
                    }
                }
                if(i==0||(len[i-1][j]==0&&len[i][j+1]==0))width[i][j]=1;
                if(i&&len[i-1][j]!=len[i][j]&&len[i-1][j]&&len[i][j]){
                    ans=false;
                    break;
                }
            }
            if(!ans)break;
        }
        int ansi =0;
        for(int i=n-1;i>=0;i--){
            for(int j=m-1;j>=0;j--){
                if(len[i][j]==0)continue;
                if(i-1>=0&&len[i-1][j])continue;
                if(j-1>=0&&len[i][j-1])continue;
                ansi++;
            }
        }
        if(!ans)printf("So Sad\n");
        else printf("There are %d ships.\n",ansi);
    }
    return 0;
}

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

题目描述

用关系“<”和“=”将3个数A、B和C依序排列时有13种不同的序关系:
ABCABCABCABCACBACBBAC

BACBCABCACABCABCBA

现在输入数字的个数,要求你给出上述关系的数目。

数的个数不大于100
 

输入格式

多组数据,EOF结束

每行一个输入

输出格式

对于每个输入,输出一行,即对应答案

输入样例

3

输出样例

13

明显是递推,但是递推公式推错了囧,而且还狂交一气

其实是dp

但是应该把当前状态分解成子状态,dp[n][m],递增的m个位置塞下n个字母,且没有位置是空的

import java.math.*;
import java.util.Scanner;
import java.io.*;
public class Main {
	public static void main(String args[]){
		BigInteger dp[][]=new BigInteger [101][101];
		BigInteger ans[]=new BigInteger[101];
		ans[0]=BigInteger.ZERO;
		for(int i=0;i<101;i++){
			for(int j=0;j<101;j++){
				dp[i][j]=BigInteger.ZERO;
			}
		}
		dp[1][1]=BigInteger.ONE;
		for(int i=2;i<101;i++){
			for(int j=1;j<=i;j++){
				dp[i][j]=(dp[i-1][j-1].add(dp[i-1][j]));
				dp[i][j]=dp[i][j].multiply(BigInteger.valueOf(j));
			}
		}
		for(int i=1;i<101;i++){
			ans[i]=BigInteger.ZERO;
			for(int j=1;j<=i;j++){
				ans[i]=ans[i].add(dp[i][j]);
			}
		}
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext()){
			int n=cin.nextInt();
			System.out.println(ans[n]);
		}
	}
}

看了解题报告还是never兄的更好

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
void print(int p[]){
    printf("%d",p[p[0]]);//p[0]用于保存长度(数组)
    for(int i=p[0]-1;i>=1;i--){
        printf("%d",p[i]/1000%10);//防止有缺失,如某个数位上为0001的情况
        printf("%d",p[i]/100%10);
        printf("%d",p[i]/10%10);
        printf("%d",p[i]%10);
    }
    printf("\n");
}
void bigintegeradd(int sum[],int p1[],int p2[]){
    sum[0]=max(p1[0],p2[0]);
    for(int i=1;i<=sum[0];i++){
        sum[i]=p1[i]+p2[i];//ATTENTION高位需置为0
    }
    for(int i=1;i<=sum[0];i++){
        sum[i+1]+=sum[i]/10000;
        sum[i]%=10000;
    }
    if(sum[sum[0]+1]){
        sum[0]++;//加法进位一位
    }
}
void bigmultiply(int mul[],int p1[],int p2[]){
    mul[0]=p1[0]+p2[0];//至少要有p1 p2长度之和+1长度
    for(int i=1;i<=p1[0];i++){//不能自身同时为参数mul和p
            for(int j=1;j<=p2[0];j++){
                mul[i+j-1]=p1[i]*p2[j];
            }
            for(int j=1;j<=mul[0];j++){
                mul[j+1]=mul[j]/10000;
                mul[j]%=10000;
            }
    }
    for(int i=mul[0]+1;i>=1;i--){
        if(mul[i]==0){mul[0]--;}
        else break;
    }
}
void bigmultiplysingle(int p[],int a){//改变自身
    for(int i=1;i<=p[0];i++){
        p[i]*=a;
    }
    for(int i=1;i<=p[0];i++){
        p[i+1]+=p[i]/10000;
        p[i]%=10000;
    }
    while(p[p[0]+1]>0){
        p[0]++;
        p[p[0]+1]=p[p[0]]/10000;
        p[p[0]]%=10000;
    }
}
int dp[101][101][101];
int ans[101][203];
int main(){
    for(int i=1;i<101;i++){
        dp[i][1][0]=1;
        dp[i][1][1]=1;
        for(int j=2;j<=i;j++){
            bigintegeradd(dp[i][j],dp[i-1][j],dp[i-1][j-1]);
  //          printf("dp[i-1][j-1] ");
           // print(dp[i-1][j-1]);
    //        printf("dp[i-1][j] ");
           // print(dp[i-1][j]);
      //      printf("after add :dp[i][j] ");
        //    printf("dp[i][j]len: %d\n",dp[i][j][0]);
            //print(dp[i][j]);
          //  printf("after multiply %d: ",j);
            bigmultiplysingle(dp[i][j],j);
         //   print(dp[i][j]);
           // for(int k=dp[i][j][0];k>0;k--)printf("%d",dp[i][j][k]);
           // printf("\n");
            //printf("dp[i][j]len: %d\n\n",dp[i][j][0]);
        }
    }
    for(int i=1;i<101;i++){
        for(int j=1;j<101;j++){
            bigintegeradd(ans[i],ans[i],dp[i][j]);
        }
    }
    int n;
    while(scanf("%d",&n)==1){
        print(ans[n]);
    }
}


posted @ 2014-07-17 12:39  雪溯  阅读(173)  评论(0编辑  收藏  举报