zoukankan      html  css  js  c++  java
  • 洛谷 P5483 [JLOI2011]小A的烦恼

    题目链接

    算法:暴力模拟

    首先我们手动模拟一下,发现我们就是把原来的数据补齐成长方形表格即可

    样例解释如下:

    a1,b1,c1
    a2,b2                                             
    
    a1,b1,c1,d1
    a2,b2
    a3,b3,c3
    a4
    
    a ,  ,  ,b ,  ,  ,
    a1,b1,c1,a1,b1,c1,d1
    a2,b2,  ,a2,b2,  , 
      ,  ,  ,a3,b3,c3,
      ,  ,  ,a4,  ,  , 
      
    

    然后我们开始模拟题意

    对于每个读入的表格,统计最大的行元素数,然后在其他行末用逗号补齐

    然后考虑把表格和答案逐行合并

    如果答案表格的该行不为空,则直接加到末尾

    否则添加与其他行逗号数量一样的逗号,然后加到末尾

    输出时不要忘记标题

    同时末尾多余逗号删去

    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    
    int read(){
    	int x=0,flag=1; char c;
    	for(c=getchar();!isdigit(c);c=getchar()) if(c=='-') flag=-1;
    	for(;isdigit(c);c=getchar()) x=((x+(x<<2))<<1)+(c^48);
    	return x*flag;
    }
    
    const int N=205;
    int n,mh,now;//行数最大值,  补齐要用的逗号数 
    int h[N],l[N];//每张表格补齐后的行,列值 
    char name[N][N];//表格名 
    char ans[N][N*N],tmp[N][N];//答案  读入表格 
    int len[N];//答案每行字符串长度 
    
    int main() {
        scanf("%d",&n);
        for(int T=1;T<=n;T++){
    	    scanf("%d %s",&h[T],name[T]);
    	    for(int i=1;i<=h[T];i++) scanf(" %s",tmp[i]);//读入 
    	    
    	    for(int i=1;i<=h[T];i++){ 
    		    int sum=0; 
    		
    			for(int j=0,le=strlen(tmp[i]);j<le;j++) 
    			if(tmp[i][j]==',') ++sum; 
    		
    			l[T]=max(l[T],sum); 
    		}
    	    l[T]++;//统计行最多逗号数,即元素数 
    		
    		if(h[T]<=mh){//是否需要扩充答案表格 
    		    for(int i=1;i<=h[T];i++){
    		    	int sum=l[T];
    			    for(int j=0,le=strlen(tmp[i]);j<le;j++){
    				    ans[i][len[i]++]=tmp[i][j];//末尾添加 
    				    if(tmp[i][j]==',') --sum;
    				}
    				while(sum) { ans[i][len[i]++]=','; --sum; }//补逗号 
    			}
    			for(int i=h[T]+1;i<=mh;i++){
    			    int sum=l[T];
    			    while(sum) { ans[i][len[i]++]=','; --sum; }//若该表行数小于答案表行数,直接补逗号 
    			}
    		}
    		else{
    		    for(int i=1;i<=h[T];i++){
    			    if(len[i]==0){//答案表新添一行 
    				    int sum=now;
    				    while(sum) { ans[i][len[i]++]=','; --sum; }//补齐之前逗号 
    				}
    				int sum=l[T];
    			    for(int j=0,le=strlen(tmp[i]);j<le;j++){
    				    ans[i][len[i]++]=tmp[i][j];//末尾添加 
    				    if(tmp[i][j]==',') --sum;
    				}
    				while(sum) { ans[i][len[i]++]=','; --sum; }//补逗号 
    			}
    		}
    		mh=max(mh,h[T]);//更新最大行数 
    		for(int i=0,le=strlen(name[T]);i<le;i++){
    		    ans[0][len[0]++]=name[T][i];//标题 
    		}
    		for(int i=1;i<=l[T];i++) ans[0][len[0]++]=',';
    	    now+=l[T];//更新之前逗号数 
    	}
    	
    	for(int i=0;i<=mh;i++){
    	    for(int j=0,le=strlen(ans[i])-1;j<le;j++) printf("%c",ans[i][j]);//输出, 不要最后位 
    	    puts("");
    	}
    	return 0;
    }
    
    
    
    
  • 相关阅读:
    微信小程序UI自动化: minium文档部署02
    微信小程序UI自动化: 选择工具/框架01
    gitalb学习:02gitlab runner安装
    gitlab学习: 01安装gitlab
    01.Python中一切皆对象
    Prometheus+Noe Expoter+Grafana:资源监控初体验(基于cenots7,没使用docker)
    01. 判断三角形的函数
    Locust性能测试:上手初体验
    史上最全的邮箱测试方法!
    使用 Python 处理非对称加密,竟然如此简单
  • 原文地址:https://www.cnblogs.com/zzhzzh123/p/12208402.html
Copyright © 2011-2022 走看看