备考CSP-J—贪心

额……既然是备考,那么一定要动脑筋,一共5题,大家好好思考一下。

一:P1250 种树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

二:P1020 [NOIP1999 提高组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

三:P1230 智力大冲浪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

四:P1095 [NOIP2007 普及组] 守望者的逃离 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

五:

某天 KID 利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID 虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为 w 的物品。岛上金属有 s 个种类, 每种金属重量不同,分别为 n1,n2,...,ns,同时每个种类的金属总的价值也不同,分别为 v1,v2,...,vs。KID 想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比

思考一小时……

思路:贪心。要让树最少,就要让树种在区间的重叠部分。所以,将尾部从小到大排序;遍历每一个区间,用一个变量表示这个区间已经种了多少棵树,若未达到意见,则从后往前种。

#include 
using namespace std;
int n,m,ans;
struct tree{
	int x,y,t;
}s[509];
bool used[10000];
bool cmp(tree a,tree b){
	return a.y>n>>m;
	for(int i=1;i<=m;i++){
		cin>>s[i].x>>s[i].y>>s[i].t;
	}
	sort(s+1,s+1+m,cmp);
	for(int i=1;i<=m;i++){
		int k=0;
		for(int j=s[i].x;j<=s[i].y;j++) if(used[j]) k++;
		if(k>=s[i].t) continue;
		for(int j=s[i].y;j>=s[i].x;j--){
			if(used[j]==0){
				k++;
				ans++;
				used[j]=1;
				if(k>=s[i].t) break;
			}
		}
	}
	cout<

思路:先挑扣款大的玩,如果时间被占用了,就只能扣钱了。

#include 
using namespace std;
int m,n,used[509],ans;
struct game{
	int t,w;
}s[509];
bool cmp(game a,game b){
	return a.w>b.w;
}
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++) cin>>s[i].t;
	for(int i=1;i<=n;i++) cin>>s[i].w;
	ans=m;
	sort(s+1,s+1+n,cmp);
	for(int i=1;i<=n;i++){
		int time=s[i].t;
		while(time>0&&used[time]) time--;
		if(time>0) used[time]=true;
		else ans-=s[i].w;
	}
	cout<

思路:能闪烁就闪烁,魔法值不够就加。

#include 
using namespace std;
int main()
{
    int m,s,t,now=0;
    cin>>m>>s>>t;
    int s1=0,s2=0;
    for(int i=1;i<=t;i++)
    {
        s1+=17;
        if(m>=10) {s2+=60;m-=10;}
        else m+=4;
        if(s2>s1) s1=s2;
        if(s1>s){
            cout<<"Yes"<

思路:算一算性价比

#include
using namespace std;
struct gold{
    int n,v; double dj;
} a[109];
int k,s,w;double ans_v; 
int cmp(gold x,gold y) 
{ return x.dj>y.dj;}
int main()
{   cin>>k;
    while(k--)
    {
        cin>>w>>s;
        ans_v=0; 
        for(int i=1;i<=s;i++)
        {
            cin>>a[i].n>>a[i].v;
            a[i].dj=a[i].v*1.0/a[i].n;
        }
        sort(a+1,a+1+s,cmp);
        int j=1;
        while(w>0&&j<=s)
        {
            if(a[j].n

你可能感兴趣的:(CSP-J一等奖高分冲刺,算法,数据结构,贪心算法)