1 条题解

  • 0
    @ 2025-8-24 22:46:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Big_Dinosaur
    我觉得在孝坤楼里学习,充满了温暖和力量,让我感到开心———JYA ||https://www.luogu.com.cn/article/wt2yqbuo||https://www.cnblogs.com/BigDinosaur

    搬运于2025-08-24 22:46:26,当前版本为作者最后更新于2023-05-20 12:53:17,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    给出 xx ,要求你构造出一个长度不超过 xx 的整数 yy ,使计算 x+yx+y 时出现 kk 个进位。

    核心思路

    因为 00 不能进位,其它数字可以。所以,我们可以把 xx 末尾的 00 删掉,并统计个数,放在变量 aa 个 中,继续。

    删掉 00 之后,如果位数 <k<k ,就输出 1-1

    否则,建立 ss 字符串,如果 xx 包含非零数个数 <k<k ,将非零数在 ss 字符串中对应位设 99 ,否则设 00 ,每设一个 99kk11

    接下来,在非零数之前的 00 ,因进位变成了 11 ,将对应位设 99 ,又产生进位,同时如果它前面有 00 ,那个 00 变成了 11 ,加 99 又会进位。所以,将后 kk00 对应位变成 99 ,就可以了。

    如果 xx 包含非零书个数 k\ge k ,将前 kk 个非零数在 ss 字符串中对应位设 99 ,否则设 00

    最后,对于没有输出 1-1 的情况下,输出 aa00 ,一组数据处理完成。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int t,k,a;string x,s;
    void doit(){
    	s="";a=0;
    	while(x[x.size()-1]=='0'){
    		x.erase(x.size()-1);++a;
    	}
    	if(x.size()<k){
    		puts("-1");return;
    	}
    	for(int i=0;i<x.size();++i)if(x[i]=='0'||!k)s+='0';else{
    		s+='9';--k;
    	}
    	for(int i=x.size()-1;i>=0;--i)if(x[i]=='0'&&k){
    		s[i]='9';--k;
    	}
    	cout<<s;
    	for(int i=1;i<=a;++i)putchar('0');puts("");
    }
    int main(){
    	scanf("%d",&t);
    	while(t--){
    		cin>>x>>k;
    		doit();
    	}
    }
    
    • 1

    [入门赛 #11] [yLOI2021] 扶苏与 1 (Hard Version)

    信息

    ID
    8608
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者