社区讨论
数据过水
P1857质数取石子参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lz1d1irv
- 此快照首次捕获于
- 2024/07/25 22:19 2 年前
- 此快照最后确认于
- 2024/07/26 08:30 2 年前
rt,这份代码没过样例但是满分!
CPP# include <bits/stdc++.h>
using namespace std;
const int N = 2e4;
int vis[N],prim[N];
int cnt = 0;
int f[N];
int ans[N];
const int inf = INT_MAX;
void init()
{
for(int i = 2;i <= N;i++)
{
if(!vis[i])
{
prim[++cnt] = i;
f[i] = 1;
}
for(int j = 1;j <= cnt && i*prim[j] <= N;j++)
{
vis[i*prim[j]] = 1;
if(i % prim[j] == 0) break;
}
}
}
int main (){
init();
int t;
scanf("%d",&t);
for(int i = 1;i <= N;i++)
{
if(f[i]) continue;
for(int j = 1;j <= cnt && prim[j] <= i;j++)
{
if(!f[i-prim[j]])
{
f[i] = 1;
break;
}
}
}
// cout << "true" << endl;
for(int i = 2;i <= N;i++)
{
if(f[i])
{
ans[i] = inf;
// cout << cnt << endl;
for(int j = 1;j <= cnt && prim[j] <= i;j++)
{
// cout << j << endl;/
if(f[i-prim[j]])
{
ans[i] = min(ans[i],inf);
}
else
{
ans[i] = min(ans[i],ans[i-prim[j]]+1);
}
}
}
else
{
ans[i] = 0;
for(int j = 1;j <= cnt && prim[j] <= i;j++)
{
if(f[i-prim[j]])
{
ans[i] = max(ans[i],ans[i-prim[j]]+1);
}
else
{
ans[i] = max(ans[i],ans[i-prim[j]]+1);
}
}
}
}
// cout << "true" << endl;
while(t--)
{
int n;
scanf("%d",&n);
if(!f[n]) cout << -1 << endl;
else cout << ans[n] << endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...