专栏文章
题解:P13316 [GCJ 2012 #1A] Kingdom Rush
P13316题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minmie9m
- 此快照首次捕获于
- 2025/12/02 04:50 3 个月前
- 此快照最后确认于
- 2025/12/02 04:50 3 个月前
很容易想到一个贪心思路:把一星要的星星和二星的分开升序排序,然后从前往后通二星,星星不够就从前往后通一星,直到星星够。
但这是错的,因为通了一星之后,二星不能拿到两个星,只能拿一个,然后就需要通更多一星。
所以考虑尽可能多的关卡是直接通二星。所以在通一星补星的时候如果有多个可以通的关卡,则优先选择其二星门槛高的(因为门槛越高越后面才会过)。
code
CPP#include<bits/stdc++.h>
using namespace std;
int a[101],sum[10001];
bool b[100001];
int main(){
memset(sum,0x3f,sizeof(sum));
int l,s,t,m;
cin>>l>>s>>t>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
sort(a,a+m+2);
int sum1=0;
for(int i=1;i<=m+1;i++){
if(a[i]-a[i-1]<=t*s){
sum1+=a[i]-a[i-1];
}
else{
sum1+=(a[i]-a[i-1])%t+t;
}
b[sum1]=true;
}
sum[0]=0;
for(int i=1;i<=sum1+t;i++){
for(int j=s;j<=t;j++){
if((i-j)>=0){
sum[i]=min(sum[i],sum[i-j]+b[i]);
}
}
}
int ans=INT_MAX;
for(int i=sum1;i<=sum1+t;i++){
ans=min(ans,sum[i]);
}
cout<<ans;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...