题解:CF1032B Personalized Cup

本题题意

给一个字符串,将其分成等长度的字符串,但是分的行数不能超过 \(5\) 行,每行的长度不得超过 \(20\)。如果无法等分的,则用 * 来补足长度。输出在行数最小的前提下,列数最少的一种方案。

思路

由于字符串范围最多也就 \(20\times5\),直接分类讨论即可。

AC code

#include<bits/stdc++.h>
using namespace std;
string s;
void q(int l,int len){ //输出行和每段长度
	cout<<l<<" ";
	int h=len/l;
	if(len%l>0) h++;//注意:如果len不整除l,则要+1
	cout<<h<<endl;
}
void out(int a,int b){//输出s的a到b项
	a--;
	b--;
  //由于字符串存储是从0开始的,a和b要往前一位
	for(int i=a;i<=b;i++){
		cout<<s[i];
	}
	cout<<endl;
}
void out_2(int a,int b){//输出有星号的
	cout<<"*";
	out(a,b);
}
int main(){
	cin>>s;
	int len=s.size();
	if(len<=20){//输出一行的情况
		q(1,len);
		out(1,len);
	}else if(len<=40){//输出两行的情况
		q(2,len);
		if(len%2==0){
			out(1,len/2);
			out(len/2+1,len);
		}
		else{
			out_2(1,len/2);
			out(len/2+1,len);
		}
	}else if(len<=60){//输出三行的情况
		q(3,len);
		if(len%3==0){
			out(1,len/3);
			out(len/3+1,len/3*2);
			out(len/3*2+1,len);
		}else if(len%3==1){
			out_2(1,len/3);
			out_2(len/3+1,len/3*2);
			out(len/3*2+1,len);
		}else{
			out_2(1,len/3);
			out(len/3+1,len/3*2+1);
			out(len/3*2+2,len);
		}
	}else if(len<=80){//输出四行的情况
		q(4,len);
		if(len%4==0){
			out(1,len/4);
			out(len/4+1,len/2);
			out(len/2+1,len/4*3);
			out(len/4*3+1,len);
		}else if(len%4==1){
			out_2(1,len/4);
			out_2(len/4+1,len/2);
			out_2(len/2+1,len/4*3);
			out(len/4*3+1,len);
		}else if(len%4==2){
			out_2(1,len/4);
			out_2(len/4+1,len/2-1);
			out(len/2,len/4*3+1);
			out(len/4*3+2,len);
		}else{
			out_2(1,len/4);
			out(len/4+1,len/2);
			out(len/2+1,len/4*3+2);
			out(len/4*3+3,len);
		}
	}else if(len<=100){//输出五行的情况
		q(5,len);
		if(len%5==0){
			out(1,len/5);
			out(len/5+1,len/5*2);
			out(len/5*2+1,len/5*3);
			out(len/5*3+1,len/5*4);
			out(len/5*4+1,len);
		}else if(len%5==1){
			out_2(1,len/5);
			out_2(len/5+1,len/5*2);
			out_2(len/5*2+1,len/5*3);
			out_2(len/5*3+1,len/5*4);
			out(len/5*4+1,len);
		}else if(len%5==2){
			out_2(1,len/5);
			out_2(len/5+1,len/5*2);
			out_2(len/5*2+1,len/5*3);
			out(len/5*3+1,len/5*4+1);
			out(len/5*4+2,len);
		}else if(len%5==3){
			out_2(1,len/5);
			out_2(len/5+1,len/5*2);
			out(len/5*2+1,len/5*3+1);
			out(len/5*3+2,len/5*4+2);
			out(len/5*4+3,len);
		}else{
			out_2(1,len/5);
			out(len/5+1,len/5*2+1);
			out(len/5*2+2,len/5*3+2);
			out(len/5*3+3,len/5*4+3);
			out(len/5*4+4,len);
		}
	}
    //最后说一句:一定要亲自测一遍!不然最后输出可能会存在问题!
    //又臭又长(((
	return 0;
}
posted @   Laoda_Bryant  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示