话说你们刷题放题解的时候没有认真地深究过题目的吗

这么多错误答案放在题解上面,遭不住了

状态 耗时 内存占用

#1 Accepted 0ms 65.957MiB
#2 Accepted 0ms 65.949MiB
#3 Accepted 0ms 65.957MiB
#4 Accepted 0ms 65.953MiB
#5 Accepted 0ms 65.957MiB
#6 Accepted 0ms 65.957MiB
#7 Accepted 15ms 65.949MiB
#8 Accepted 15ms 65.961MiB
#9 Accepted 15ms 65.957MiB
#10 Accepted 0ms 65.961MiB
```c++
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <iostream>
#include <string>
#include <map>
#include <ciso646>
#include <stack>
using namespace std;

int dp[17000000];

int ans;
int n, i;

int main()
{
scanf("%d", &n);

dp[1] = 0;
dp[2] = 1;
dp[3] = 1;
for (i = 4;i <= n;i++)
{
if (i%3!=0)
dp[i] = dp[i / 3+1] + 1;
else dp[i] = dp[i / 3] + 1;

}
dp[1] = 0;
printf("%d", dp[n]);

system("pause");

return 0;
}
```

这道题无疑是数据太弱了,我手算了整整一页纸,题解这一页的代码基本都有大大小小的漏洞
首先连续除以三那个肯定是错的,然后有人提出来说n=n/3+n%3的递推式,但是这个递推式本身是错误的,因为在n=3k+2的情况下,最优解应该是k,k+1,k+1,在那个递推式情况下就会变成k,k,k+2,这样最优解就变成了a[k+2]+1而不是a[k+1]+1.所以那个递推式写的程序连样例都过不去的。然后唯一一个用dp的pascal代码的问题在于a[1]初始化成了1,就是说整个递推式是好运ac的。

下面说说我的想法
对于3k的情况毫无疑问答案是a[k]+1,因为分成3个k称一次之后就跟k的情况相同
对于3k+1和3k+2,分别分成k,k,k+1和k,k+1,k+1,运气最差的情况就是那个重的在k+1的堆里,那么答案就是a[k+1]+1.

这道题的数据是越小越容易检测出程序的bug,当数变大的时候所有错误的解法都能得到正确的结论,因为a[k],a[k+1],a[k+2]只有在k很小的时候才会不同

如果还有什么bug欢迎探讨。。。。我是菜鸟,大牛勿喷

1 条评论

  • 1

信息

ID
1361
难度
2
分类
其他 | 数学 点击显示
标签
(无)
递交数
2133
已通过
1304
通过率
61%
被复制
3
上传者