QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#296374 | #6300. Best Carry Player 2 | HJR | WA | 1ms | 3868kb | C++23 | 3.3kb | 2024-01-02 20:35:27 | 2024-01-02 20:35:27 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define debug(x) cout<<#x<<": "<<x<<endl
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll=long long;
using ull=unsigned long long;
#define int long long
using i128 = __int128;
void print(__int128 x)
{
if (x < 0)
{
cout<<('-');
x = -x;
}
if (x > 9)
print(x / 10);
char ch=(x % 10 + '0');
cout<<ch;
}
__int128 c10[40];
__int128 nu[10];
int x,k;
string s;
int n;
__int128 res,now;
string cur;
int cnt;
int dp[40];
int vis[40][40][2];
void dfs(int i,int carry){
// if(now==9008900)
// cout<<"!!!!";
// if(i==4&&cnt==2&&carry==1){
// print(now);
// cout<<endl;
// }
if(cnt>k||i>36)
return;
if(res<now&&res!=0)
return;
if(vis[i][cnt][carry])
return;
vis[i][cnt][carry]=1;
if((((carry&&s[i]!='9')||(!carry))&&cnt==k)||(carry&&cnt+dp[i]==k)){
if(res==0)
res=now;
else
res=min(res,now);
return;
}
if(carry&&s[i]=='9'){
cur+='0';
cnt++;
dfs(i+1,1);
cnt--;
cur.pop_back();
return;
}
// //no jin
cur+='0';
dfs(i+1,0);
cur.pop_back();
//jin
if(carry){
int ad=10-(s[i]-'0'+1);
cur+='0'+ad;
cnt++;
now+=nu[ad]*c10[i];
dfs(i+1,1);
now-=nu[ad]*c10[i];
cnt--;
cur.pop_back();
}
else{
int ad=10-(s[i]-'0');
if(ad!=10){
cur+='0'+ad;
cnt++;
now+=nu[ad]*c10[i];
dfs(i+1,1);
now-=nu[ad]*c10[i];
cnt--;
cur.pop_back();
}
}
};
void solve(){
cin>>x>>k;
s=to_string(x);
n=s.size();
if(k==0){
string cur;
for(int i=s.size()-1;i>=0;i--){
if(s[i]!='9'){
cur+='1';
reverse(cur.begin(),cur.end());
cout<<cur<<endl;
return;
}
else{
cur+='0';
}
}
cur+='1';
reverse(cur.begin(),cur.end());
cout<<cur<<endl;
return;
}
res=0;
now=0;
reverse(s.begin(),s.end());
for(int i=0;i<40;i++)
s+='0';
cur="";
cnt=0;
memset(dp,0,sizeof dp);
for(int i=0;i<40;i++){
int cc=0;
for(int j=i;j<40;j++){
if(s[j]=='9')
cc++;
else
break;
}
dp[i]=cc;
}
now=0;
memset(vis,0,sizeof vis);
dfs(0,0);
print(res);
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
c10[0]=1;
__int128 ten=10;
for(int i=1;i<40;i++){
c10[i]=c10[i-1]*ten;
}
for(int i=0;i<10;i++)
nu[i]=i;
int t;
cin>>t;
while(t--){
solve();
}
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3704kb
input:
4 12345678 0 12345678 5 12345678 18 990099 5
output:
1 54322 999999999987654322 9910
result:
ok 4 lines
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3868kb
input:
21 999990000099999 0 999990000099999 1 999990000099999 2 999990000099999 3 999990000099999 4 999990000099999 5 999990000099999 6 999990000099999 7 999990000099999 8 999990000099999 9 999990000099999 10 999990000099999 11 999990000099999 12 999990000099999 13 999990000099999 14 999990000099999 15 999...
output:
100000 10000 1000 100 10 1 900001 9900001 99900001 999900001 10999910000 9999910000 9999901000 9999900100 9999900010 9999900001 9000009999900001 99000009999900001 999000009999900001 99999999999999999900000000000000000 1000000000000000000
result:
wrong answer 11th lines differ - expected: '10000000001', found: '10999910000'