专栏文章
题解:P14360 [CSP-J 2025] 多边形 / polygon(民间数据)
P14360题解参与者 14已保存评论 13
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @minfh8gt
- 此快照首次捕获于
- 2025/12/02 01:33 3 个月前
- 此快照最后确认于
- 2025/12/02 01:33 3 个月前
背景
考场应该切了, 题总用时 分钟。
题意
给你 个木棍,求出可以拼出的多边形数?
分析
符合条件要满足 。
不妨两边都减去 。
变成 。
这个是不是更加熟悉了。
注意到,排序就可以解决最大值的问题。
那么问题就变成了,对于每一个 ,求前面大于 的方案数。
明显背包版题,只是注意到 很大,直接做会超时加超空间。
但我们只要求大于 的方案数,而且 ,那么把 到 都放进 就行了。
Code
CPP#include<bits/stdc++.h>
using namespace std;
// #define int long long
#define File(x) (freopen(x".in","r",stdin),freopen(x".out","w",stdout))
#define Filein(x) freopen(x".in","r",stdin)
const int N=5e3+5,M=1e5+10,mod=998244353;
int n;
int a[N];
int dp[M];
void work(){
cin>>n;
int V=0,ans=0;
for(int i=1;i<=n;i++)
cin>>a[i],V+=a[i];
V=min(V,5001);
sort(a+1,a+n+1);
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=a[i]+1;j<=V;j++)
ans=(ans+dp[j])%mod;
for(int j=V;j>=0;j--)
dp[min(j+a[i],5001)]=(dp[min(j+a[i],5001)]+dp[j])%mod;
//通过min(j+a[i],5001)实现把大于压缩进一个
}
cout<<ans;
}
void clear(){}
signed main(){
int _=1;
while(_--)work(),clear();
return 0;
}
/*
*/
评价
T4 放板子题太水了,今年 CSP-S 我考炸了,也算是安慰吧!
相关推荐
评论
共 13 条评论,欢迎与作者交流。
正在加载评论...