1462 C. Unique Number

该博客讨论了一个编程问题,题目要求找到一个整数t,其各位数字之和等于给定的数字x,并且各位数字互不相同。当x超过45时,由于无法构成符合条件的t,答案为-1;否则,通过一系列操作构造最小的t并输出。解决方案包括初始化数组a,用最大值9开始,每次从x中减去max并将max存入数组,直到x小于等于max。最后倒序输出数组a得到结果。
摘要由CSDN通过智能技术生成

https://codeforces.ml/contest/1462/problem/C

题意:给你个数字x,让你去找一个整数t,满足t的各个位上的数字之和等于x,同时各个位上的数字互不相同。找得到就输出最小的t,找不到就输出-1。

注意到各个位上的数字互不相同,所以t最多是9位,由123456789组成,因此x的上限就是1+2+3…+9=45,超过45就找不到,输出-1。
接下来解决x<=45的情况。我们开个数组a,取max=9,对于每次操作,只要x>max,就让x-max,把max存进数组中,然后max-1(因为不能相同),重复这样的操作直到x<=max。然后把数组a倒着输出就行(因为要使t尽可能小)。

#include <bits/stdc++.h>
using namespace std;

int main() {
	int t;
	cin >> t;
	while (t--) {
		int x;
		cin >> x;
		if (x > 45)
			cout << "-1" << endl;
		else {
			int max = 9;
			int a[10];
			int k = 0;
			while (1) {
				if (x <= max) {
					a[k] = x;
					break;
				}
				if (x > max) {
					a[k] = max;
					x -= max;
					max--;
					k++;
				}
			}
			for (int i = k; i >= 0; i--) {
				cout << a[i];
			}
			cout << endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值