CF1493A Anti-knapsack 题解
Content
给定 \(T\) 组数据,每组数据给定两个数 \(n\) 和 \(k\),要你从 \(1\sim n\) 中选出最多的数,使得这些数中不存在某些数的和为 \(k\),并输出方案。
数据范围:\(1\leqslant T\leqslant 100\),\(1\leqslant k\leqslant n\leqslant 1000\)。
Solution
很容易想到,如果 \(k<n\),那么 \([k+1,n]\) 之间的所有整数都是可以取的,因此我们先选完所有在 \([k+1,n]\) 之间的整数。
显然 \(k\) 是不能够取的。因此我们现在再考虑 \([1,k-1]\) 之间的情况,其实也很简单。我们开一个 \(vis\) 数组(\(vis_i\) 表示数 \(i\) 是否取过,取过为 \(1\),没取过为 \(0\)),然后在取当前数 \(i\) 的时候,看是否有 \(vis_{k-i}=1\),如果 \(vis_{k-i}=1\),那么 \(i\) 就不能再去取了,否则你就可以取这个数。
至于方案直接再开个数组统计就好了,具体看代码实现。
Code
int ans[1007], vis[1007];
int main() {
MT {
memset(ans, 0, sizeof(ans));
memset(vis, 0, sizeof(vis));
int n = Rint, k = Rint;
R(i, n, k + 1) ans[++ans[0]] = i;
R(i, k - 1, 1) if(!vis[k - i]) ans[++ans[0]] = i, vis[i] = 1;
write(ans[0]), puts("");
F(i, 1, ans[0]) write(ans[i]), putchar(' ');
puts("");
}
return 0;
}

浙公网安备 33010602011771号