专栏文章

题解: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 条评论,欢迎与作者交流。

正在加载评论...