算法设计与分析作业贪心法

本文介绍了两个编程问题的解决方案:一是通过排序构造最大的数字接龙,二是利用贪心策略计算满足小兔子胡萝卜需求的最大数量。程序采用C++实现,分别通过排序和贪心算法达到目标,展示了在算法设计中的效率和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.暑假,小民和弟弟一起玩数字接龙游戏。将n(2≤n≤20)个正整数A1...An(1≤Ai≤1000)任意次序排列首尾连接,拼接成一个新的整数;接龙而成的整数更大者获胜。请你帮助小民编写一个程序构造出最大的整数吧。

【Input】

输入共两行;第一行有一个整数,表示数字个数 n;第二行有 n 个整数,表示给出的 n 个整数 Ai。

【Output】  一个正整数,表示最大的整数。

Sample Input 1 】

3

13 312 343

【Sample Output 1】

34331213

#include <iostream>
#include <vector>
#include <iterator>
#include <string>
#include<algorithm>
using namespace std;
 
bool cmp(string i,string j)
{
    return (i+j)>(j+i);//提供排序规则
}
 /*
 Sort(start,end,cmp)
参数
(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序。
 sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。
一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)。而sort函数的强大之处在可与cmp函数结合使用,即排序方法的选择。
 */
int main()
{
    vector<string> vec;
    int num;
    cin>>num;
    for(int i = 0; i < num; ++i)
    {
        string temp;
        cin>>temp;
        vec.push_back(temp);
    }
    sort(vec.begin(),vec.end(),cmp);
    for(vector<string>::iterator it = vec.begin(); it != vec.end(); ++it)
    {
        cout<<(*it);
    }
    cout<<endl;
    return 0;
}

2. 小民家里养不少小兔子,他每天放学都会拿着一筐胡萝卜去喂它们。

已知小兔子i希望最少能得到gi克的胡萝卜,如果胡萝卜j的重量wj>=gi,小民就将胡萝卜j喂给小兔子i,小兔子才会满足。

请你帮助小民设计一个程序,计算出最多能满足多少只小兔子。

注:gi、wi为正整数,每只兔子只能喂1根胡萝卜。

【输入】

输入数据为3行。

第1行,为整数N(1<=N<=20)和M(1<=M<=100),以“空格”为分隔符;分别表示有N只兔子和有M根胡萝卜。

第2行,为N个整数gi,以“空格”为分隔符;分别表示每只兔子希望最少能得到重量为gi的胡萝卜。

第3行,为M个整数wi,以“空格”为分隔符;分别小时每根胡萝卜的重量。

【输出】

输出为1行。1个整数X,表示最多能满足X只兔子。

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <iostream>
/* 分孩子饼干或分兔子胡萝卜*/
using namespace std;
// g表示胃口   s表示饼干尺寸  
// 需要 g[i]<=s[j]且是s中的最大值
// 时间复杂度O(n) 
int findContentChildren(std::vector<int>& g, std::vector<int>& s) {
	// 对两个列表进行排序
	std::sort(g.begin(),g.end()); // sort 默认升序
	std::sort(s.begin(),s.end());
	unsigned int child = 0; //有多少孩子被满足
	unsigned int cookie = 0; //有多少饼干被孩子满足 
	
	while(child < g.size() && cookie < s.size()){
		if(g[child] <= s[cookie]){
			child ++;
		}
		cookie ++;
	}
	return child;
} 


// 测试结果 
int main(){
	std::vector<int> g;  //孩子,即兔子的胃口满足重量值
	std::vector<int> s;  //饼干,即胡萝卜的重量
	int N,M,i=0,gi;   //N个兔子,M根胡萝卜
	cin >> N >>  M;
//	cout << "N =" << N << ",M=" << M << endl;
	for(i=0;i<N;i++)
	{
		cin >> gi;
		g.push_back(gi);
	}
	for(i=0;i<M;i++)
	{
		cin >> gi;
		s.push_back(gi);
	}

	int ans = findContentChildren(g,s);
	printf("%d\n",ans);
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值