解题思路:
位数相同的数字大小关系取决于不同最高位的大小有关,所以我们可以先找从最高位到低位最多有多少位可以变成9
观察数据发现数字n最多是1E17,也就是17位用dfs不会超时
对于剩余的A和B操作次数
B:可以遍历剩余的位数看看是否能将某一位变成9(高位优先)
A:直接在剩余位数的最高位加上剩余的A操作次数就好
参考代码:
#include<bits/stdc++.h> using namespace std; struct node { int a,b; }x[105]; int ans=0; int numa=0; int numb=0; string n; void dfs(int i,int a,int b) { if(i==n.length()||(x[i].a>a&&x[i].b>b)) { if(ans<i) { ans=i; numa=a; numb=b; } else if(ans==i) { numa=max(numa,a); numb=max(numb,b); } return; } if(x[i].a<=a) { dfs(i+1,a-x[i].a,b); } if(x[i].b<=b) { dfs(i+1,a,b-x[i].b); } } int main() { int a,b; cin>>n>>a>>b; for(int i=0;i<n.length();i++) { x[i].a='9'-n[i]; x[i].b=((n[i]-'0')+1)%10; //cout<<x[i].b; } dfs(0,a,b); for(int i=0;i<ans;i++) { n[i]='9'; } for(int i=ans;i<n.length();i++) { if(x[i].b<=numb) { numb-=x[i].b; n[i]='9'; } } for(int i=ans;i<n.length();i++) { if(x[i].a>numa) { n[i]+=numa; break; } } cout<<n; return 0; }
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:1528 |
C语言程序设计教程(第三版)课后习题8.4 (C++代码)浏览:615 |
C语言程序设计教程(第三版)课后习题6.11 (C++代码)浏览:794 |
人见人爱A+B (C语言代码)浏览:1046 |
C二级辅导-进制转换 (C语言代码)浏览:1048 |
母牛的故事 (C语言代码)浏览:782 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:597 |
printf基础练习2 (C语言代码)浏览:321 |
不会做的浏览:954 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:539 |