• 牛客练习赛86 B. A + B(构造)


    链接:https://ac.nowcoder.com/acm/contest/11176/B
    来源:牛客网

    题目描述

    A + B ProblemA + B Problem 往往是大家在各Online JudgeOnline Judge通过的第一道题目,刚刚学会写程序的嘟嘟也不例外。然而,单纯的读入两个数字A,BA,B并输出它们的总和CC,对于聪明伶俐又可爱的牛牛来说实在是太简单了。富有挑战精神的她忍不住想:「假如只有A,B,CA,B,C三个数字视为字符串拼接起来后的结果ss,我有办法还原出当初的数字A,B,CA,B,C并满足A+B=CA+B=C吗?」

    举例来说,如果 s="123"s="123",那么可以还原出 1+2=31+2=3

    注意有前导零的数字和空是不能作为数字的,如 s="1023"s="1023",则不能被还原成 1+02=31+02=3。

    嘟嘟想找出 NN 组有 KK 种还原方式的输入字符串 ss,但是她却心有余而力不足,身为她的朋友,你,便自告奋勇的来帮她找出 NN 组有 KK 种还原方式的输入!

    输入描述:

    输入只有一行,给出两个以空格分隔的正整数K,NK,N,代表嘟嘟想找出 NN 组有 KK 种还原方式的输入字符串。0≤K≤20≤K≤21≤N≤1001≤N≤100
    

    输出描述:

    请输出 NN 行,每行一个字符串 sisi,代表 sisi 有 kk 种还原的方法。 sisi 必须满足以下条件:
    1≤∣si∣≤301≤∣si∣≤30
    sisi 由数字 12345678901234567890 组成
    si≠sj,∀i≠jsi�=sj,∀i�=j,即任两个输出字符串都不相等sisi 必须恰有 KK 种还原的方法如果有超过 NN 个满足条件的 sisi,按照任意顺序输出任意的 NN 个即可
    

    示例1

    输入

    复制

    2 1
    

    输出

    复制

    11111122
    

    示例2

    输入

    复制

    0 1
    

    输出

    复制

    1023
    

    示例3

    输入

    复制

    1 2
    

    输出

    复制

    123
    101
    

    根据样例就能构造的差不多了,直接分k = 0, 1, 2三种情况构造:

    k = 0:因为不能有前导0,因此只要串的第一个字符是0,剩下的只要不是回文串一定满足题意。

    k = 1:构造1111 + 2222 = 3333, 2222 + 2222 = 4444这样(每一位对应起来,且不要有进位)。

    k = 2:构造1110111,可以拆成111 + 0 = 111,也可以拆成1 + 110 = 111。

    注意 si长度不超过30,因此需要对上面沟造出来的适当扩展一下位数。

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
    	int n, k;
    	cin >> k >> n;
    	if(k == 0) {
    		int cnt = 0;
    		while(1) {
    			if(cnt == n) break;
    			for(int k = 1; k <= 8; k++) {
    				if(cnt == n) break;
    				for(int i = 1; i <= 14; i++) {
    					if(cnt == n) break;
    					cnt++;
    					cout << 0;
    					for(int j = 1; j <= i; j++) {
    						cout << k;
    					}
    					for(int j = 1; j <= i; j++) {
    						cout << k + 1;
    					}
    					cout << endl;
    				}
    			}
    		}
    	} else if(k == 1) {
    		int cnt = 0;
    		for(int k = 1; k <= 8; k++) {
    			if(cnt == n) break;
    			for(int i = 1; i <= 10; i++) {
    				if(cnt == n) break;
    				cnt++;
    				for(int j = 1; j <= i; j++) cout << 1;
    				for(int j = 1; j <= i; j++) cout << k;
    				for(int j = 1; j <= i; j++) cout << k + 1;
    				cout << endl;
    			}
    		}
    		for(int k = 2; k <= 4; k *= 2) {//注意这里必须从2开始构造 不然会重复
    			if(cnt == n) break;
    			for(int i = 1; i <= 10; i++) {
    				if(cnt == n) break;
    				cnt++;
    				for(int j = 1; j <= i; j++) cout << k;
    				for(int j = 1; j <= i; j++) cout << k;
    				for(int j = 1; j <= i; j++) cout << k + k;
    				cout << endl;
    			}
    		}
    	} else {
    		int cnt = 0;
    		for(int k = 1; k <= 9; k++) {
    			if(cnt == n) break;
    			for(int i = 2; i <= 14; i++) {
    				if(cnt == n) break;
    				cnt++;
    				for(int j = 1; j <= i; j++) cout << k;
    				cout << 0;
    				for(int j = 1; j <= i; j++) cout << k;
    				cout << endl;
    			}
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    重新开发四则运算器
    结对编程
    四则运算 个人项目整理
    DAY 012--dict(增、删、改、查、合并)
    001--面向对象 V.S 面向过程
    DAY 011--Tuple使用方法汇总
    001--二分法(Binary search)
    DAY 006--查找某个值是否在列表中(二分法)
    DAY 009--str(替换三种方法)
    DAY 008--str(常见判断条件)
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14993486.html
Copyright © 2020-2023  润新知