我在比赛的某个地方发现了这个问题,但还没有找到解决方案.
我有正整数.我必须找到最长的子集,在每两个相邻元素中,一个除以另一个.
我正在做的是:我正在创建图形.然后我正在连接其中数字彼此分开的节点.之后我正在使用DFS(一个节点可以连接两个节点).
但并非所有测试用例都适用于系统.在使用之前我是否必须对数组进行排序DFS?也许有特殊的(动态)算法?
失败的测试用例:
N = 5
1 1 3 7 13
Run Code Online (Sandbox Code Playgroud)
我的代码给出了输出4.但如果我arrange这个数组像这样:
3 1 7 1 13
Run Code Online (Sandbox Code Playgroud)
输出是5,这是真正的答案.
我也使用了递归方法.但我需要更快的东西.
我在比赛的某个地方发现了这个问题,但还没有找到解决方案.
我可以在屏幕上的另一个地方"选择","复制","插入"和"移动".最初我有一个大小为1x1的矩形.我需要做的最少量的操作来构建另一个矩形,其大小是AxB.
这是我的错误代码:
#include <iostream>
#include <cmath>
#define size 1002
using namespace std;
int main()
{
int painta[size];
int paintb[size];
int i,j,a,b,temp;
cin >> a >> b;
if (a>b)
{
temp=a;
a=b;
b=temp;
}
painta[1]=4;
for (i=2; i<=a; i++)
painta[i]=painta[i-1]+2;
for (i=2; i<=a; i++)
{
painta[2*i]=min(painta[i]+4,painta[2*i]);
for (j=3*i; j<=a; j+=i)
{
painta[j]=min(painta[j-i]+2,painta[j]);
}
}
paintb[1]=painta[a];
paintb[2]=paintb[1]+4;
for (i=3; i<=b; i++)
paintb[i]=paintb[i-1]+2;
for (i=2; i<=b; i++)
{
paintb[2*i] = min(paintb[i]+4,paintb[2*i]);
for (j=3*i; j<=b; j+=i)
{
paintb[j]=min(paintb[j-i]+2,paintb[j]);
}
}
cout << paintb[b] …Run Code Online (Sandbox Code Playgroud)