问题标题: 洛谷:P1898 QwQ 橙题写成这样

0
0
已解决
黄子扬
黄子扬
初级天翼
初级天翼

自己debug了很久,两个样例也都过了,确信没错【doge】,交上去却WA0分了,还不能下载数据/kk

#include<bits/stdc++.h>
using namespace std;
string s;
int ST,num[105][105],f,x,a[105],ret;
void debug(int i)
{
    for(int j=1;j<=f;j++)
        printf("%d ",num[i][j]);
    printf("\n");
}
void output(int i,int f)
{
    if(f-i+1==1)
        printf("%d",num[i][1]),ret=1;
    else if(f-i+1==2&&num[i][1]!=0)
        printf("%d%d",num[i][1],num[i][2]),ret=1;
    else if(f-i+1==3&&num[i][1]==1&&num[i][2]==0&&num[i][3]==0)
        printf("%d%d%d",num[i][1],num[i][2],num[i][3]),ret=1;
}
int main()
{
    getline(cin,s);
    scanf("%d",&ST);
    for(int i=s.size()-1;i>=0;i--)
    {   
        x=s[i]-'A'+ST;
        while(x)
        {
            a[++f]=x%10;
            x/=10;
        }
    }
    for(int i=1;i<=f;i++)
        num[1][i]=a[f-i+1];
    //debug(1);
    for(int i=2;i<=f;i++)
    {
        for(int j=1;j<=f-i+1;j++)
            num[i][j]=(num[i-1][j]+num[i-1][j+1])%10;
        //debug(i);
        output(i,f);
        if(ret)
            return 0;
    }
    return 0;
}

求dalao给我hack啊啊啊啊啊啊,当然,这题我的二维写法纯属弱智,一维写法也是没有后效性的QwQ


0
已采纳
杜智宸
杜智宸
中级光能
中级光能

打开题解【狗头】

开玩笑的啦

思路给你了,自己想想吧

首先考虑下怎么把数字转换成字符串

因为题目给出的字符串只包含大写字符,所以我们可以用 当前字符减去'A'得到这个字符在26个大写字母中的位置。然后对于每一位进行了如上运算的数字来说,它不一定是一个0~9的数字,因此我们无法直接将其转换成字符。那么我们可以把这个数字的 每一位分离出来,单独转换为字符再加起来合并成一个字符串。

但是对于上面所说的字符串,还存在一个问题。比如我们把数字123分离后,按顺序来说我们得到的字符串应该是 321,因此,我们还要 进行一次旋转操作,将运算出来的字符串转换为 正确顺序的字符串。

其次考虑下解是否合法

在我们把数字转换为字符串后,还要对其相邻的数字进行相加。出现解的情况有:当前字符串为"100",或者当前字符串长度小于等于2。针对上面的条件而言,我们可以将原来的字符串 进行若干次相加操作,直到满足了这两个条件之一

 

0
我要回答