3 条题解
-
2
这是最快的一个
#include<iostream> #include<cstdio> #include<bitset> using namespace std; int n,g[102][2],cnt; bitset<1000006> f; int main(){ scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%d%d",&g[i][0],&g[i][1]); g[i][0]=g[i][0]*g[i][0]; g[i][1]=g[i][1]*g[i][1]; } f[0]=1; for (int i=1;i<=n;i++){ f=(f<<g[i][0])|(f<<g[i][1]); } printf("%d",f.count()); return 0; } -
-1
思路比较好想,就是去判每个数能否得到
为前个格子是否能得到
$f[i][j] = f[i-1][j-a[i][1]*a[i][1]) | f[i-1][j-a[i][2]*a[i][2])$
然后发现这个东西可以用bitset 优化
第一维可以空间优化掉
然后就做完了
#include <bits/stdc++.h> using namespace std; const int N = 101; int n; int a[N][3]; bitset<N*N*N> f; void read() { cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i][1] >> a[i][2]; a[i][1] *= a[i][1]; a[i][2] *= a[i][2]; } } void compute() { f[0] = 1; for(int i = 1; i <= n; i++) f = ((f<<a[i][1]) | (f<<a[i][2])); cout << f.count(); } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); read(); compute(); return 0; }
- 1
信息
- ID
- 289
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 51
- 已通过
- 17
- 上传者