QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#296369#6300. Best Carry Player 2HJRWA 0ms3596kbC++232.3kb2024-01-02 20:14:582024-01-02 20:14:58

Judging History

你现在查看的是最新测评结果

  • [2024-01-02 20:14:58]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3596kb
  • [2024-01-02 20:14:58]
  • 提交

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(cnt>k||i>36)
		return;
	if(res<now&&res!=0)
		return;
	if(vis[i][cnt][carry])
		return;
	vis[i][cnt][carry]=1;
	if((!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;
	}
	//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();
		}
	}
	
	// //no jin
	
	cur+='0';
	dfs(i+1,0);
	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;
	reverse(s.begin(),s.end());
	for(int i=0;i<40;i++)
		s+='0';
	cur="";
	cnt=0;
	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(dp,0,sizeof dp);
	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();
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3596kb

input:

4
12345678 0
12345678 5
12345678 18
990099 5

output:

1
54322
999999999987654322
9901

result:

wrong answer 4th lines differ - expected: '9910', found: '9901'