赛后补题的感悟
2024-11-30 15:47:14
发布于:黑龙江
16阅读
0回复
0点赞
根据题目,我们知道本题目就是模拟翻页钟,每秒变换一个数字。
错误想法
暴力模拟:
本菜菜比赛时第一个排除的想法,绝对t。
不完整的数学规律:
第二时间就是找o1解法,然后就炸了,根本不会,于是本菜开始打表,后来发现一个规律,,然后加起来就行。然后没开long long WA了,哭!赛后补题,于是就有了下面的解法
分析
我们不难发现,从10->0,需要11=10(自己)+1(十位数的影响)秒,因为十位数要变,个位也要变,这是退位的时候从当前位影响后面的每一位。
所以,我们需要计算到底被影响了几次,由于影响是可以从前往后叠加的,所以每次都会继承上一次的影响。
得出a[i]=a[i-1]+str[i].此时,a数组是第i位需要变换的次数,str字符串是原本的数字。
ACcode
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
string str;
cin>>n>>str;
vector<int>a(n+1);
str=" "+str;
for(int i=1;i<=n;i++)a[i]=a[i-1]+str[i]-'0';
for(int i=n;i>=1;i--)
{
if(a[i]/10>0)
{
a[i-1]=a[i-1]+a[i]/10;
a[i]=a[i]%10;
}
}
int flag=1;
for(int i=0;i<=n;i++)
{
if(flag&&a[i]==0)a[i]=1e9;
else if(flag&&a[i]!=0)flag=0;
}
for(int i=0;i<=n;i++)
{
if(a[i]!=1e9)
{
cout<<a[i];
}
}
cout<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
本蒟蒻菜菜,大佬轻点喷
这里空空如也
有帮助,赞一个