Jzoj 贪心算法部分题目(共7题)

2795: 【入门】总和最大

#include <bits/stdc++.h>
using namespace std;
int n, m, a[11][11], ans, mx[11];
int main()
{
    scanf("%d %d", &n, &m);
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j){
            scanf("%d", &a[i][j]);
        }
    }
    for(int i=1; i<=n; ++i){
        for(int j=1; j<=m; ++j){
        	mx[i]=max(mx[i], a[i][j]);
		}
		ans+=mx[i];
    }
    printf("%d", ans);
    return 0;
}

2794: 【基础】部分背包问题

#include <bits/stdc++.h>
using namespace std;
int n, m, ans;
struct node
{
	int w, v;
}a[10010];
//根据价值从大到小排序 
bool cmp(node x, node y)
{
	return x.v>y.v;	
}
int main()
{
	scanf("%d %d", &m, &n);		//最大载重量, 食品种类 
	for(int i=1; i<=n; ++i){
		scanf("%d %d", &a[i].w, &a[i].v);		//重量、价值 
	}
	//根据价值从大到小排序 
	sort(a+1, a+n+1, cmp);
	//先放价值大的 
	for(int i=1; i<=n; ++i){	//食品种类 
		if(m>=a[i].w){	//载重可以把第i种全放下 
			ans+=a[i].w*a[i].v;
			m-=a[i].w;
		}
		else if(m>0){	//放不下全部, 但是能放多少放多少 
			ans+=m*a[i].v;
			break;
		}
	} 
	printf("%d", ans);
	return 0;
}

1519: 【USACO】超级书架

#include <bits/stdc++.h>	
using namespace std;		
int n, h[20010], b, s, ans;
int main()
{
	scanf("%d %d", &n, &b);		//奶牛数量、书架高度 
	for(int i=1; i<=n; ++i){
		scanf("%d", &h[i]);
	} 
	sort(h+1, h+n+1);
	for(int i=n; i>=1; --i){
		s+=h[i];
		ans++;
		if(s>=b){
			break;
		}
	}
	printf("%d", ans);
	return 0;
}

2796: 【基础】排队打水问题

#include <bits/stdc++.h>
using namespace std;
int n, r, t[510], ans, id, asd[110];
int main()
{
	scanf("%d %d", &n, &r);
	for(int i=1; i<=n; ++i){
		scanf("%d", &t[i]);
	}
	sort(t+1, t+n+1);
	for(int i=1; i<=n; ++i){
		id=i%r;		//分配到哪一个水龙头 
		if(id==0){	
			id=r;
		}
		//asd[id]表示id这个水龙头前面需要等的时间
		ans=ans+t[i]+asd[id];	 
		asd[id]+=t[i];
	}
	printf("%d", ans);
	return 0;
}

2800: 【基础】装箱问题

1126: 【提高】删数问题

1642: 【USACO】Payback(还债)

猜你喜欢

转载自blog.csdn.net/u013313909/article/details/127237898