【内含 AC 代码】对第一篇题解的代码提出质疑
查看原帖
【内含 AC 代码】对第一篇题解的代码提出质疑
928972
ny_Dacong楼主2024/10/28 19:54

受害题解: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 循环。

那么还要小心传入 minlenx 为负的情况。所以最终代码应该是:

#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;
}

最后还有一处笔误:在“特判特殊数据”那里,第二点应该是:

  • 11,输出为 1-1
2024/10/28 19:54
加载中...