受害题解:https://www.luogu.com.cn/article/bvuo8vxs
思路是好思路,但是代码有问题。
首先对于 minlen 函数,其传入的 x 完全没用上。应该改为:
int minlen(int x){
if(x%7 == 0) return x/7;
else return x/7+1;
}
可以进一步优化为:
int minlen(int x){
return (x+6)/7;
}
然后是主函数。这个语句:if(minlen(n-i) < minlen(n)) 不对,因为 n 是火柴根数,而 i 是数值。
应该为:
int v[] = {6,2,5,5,4,5,6,3,7,6};
//...
if(minlen(n-v[i]) < minlen(n))//...
然后还要注意前导 0。应该先进行特判,然后再来while 循环。
那么还要小心传入 minlen 的 x 为负的情况。所以最终代码应该是:
#include<bits/stdc++.h>
using namespace std;
int t,n;
int v[] = {6,2,5,5,4,5,6,3,7,6};
int minlen(int x){
if(x < 0){
return 0x3f3f3f3f;
}
return (x+6)/7;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
if(n == 1){
puts("-1");
continue;
}
if(n == 6){
puts("6");
continue;
}
for(int i = 1; i <= 9; i++){
if(minlen(n-v[i]) < minlen(n)){
printf("%d",i);
n -= v[i];
break;
}
}
while(n > 7){
for(int i = 0; i <= 9; i++){
if(minlen(n-v[i]) < minlen(n)){
printf("%d",i);
n -= v[i];
break;
}
}
}
switch(n){
case 2:
puts("1");
break;
case 3:
puts("7");
break;
case 4:
puts("4");
break;
case 5:
puts("2");
break;
case 6:
puts("0");
break;
case 7:
puts("8");
break;
default:
puts("");
}
}
return 0;
}
最后还有一处笔误:在“特判特殊数据”那里,第二点应该是:
- 输入为 1,输出为 −1。