- 天平称量
- 2017-03-02 20:16:53 @
这么多错误答案放在题解上面,遭不住了
状态 耗时 内存占用
#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 条评论
-
twd2 LV 9 MOD @ 2017-03-03 20:49:02
您可以给差评
- 1