贪心算法3(c++)

概念

题目

最短前缀

题目描述

一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如carbon的字串是:cca,carcarb,carbo,和carbon。我们现在希望能用前缀来缩略的表示单词。例如,carbohydrate通常用carb来缩略表示,现在给你一组单词,要求你找到唯一标识每个单词的最短前缀,在下面的例子中,carbohydrate能被缩略成carboh,但是不能被缩略成carbo(或其余更短的前缀)因为已经有一个单词用carbo开始

输入格式

第一行是一个正整数,表示输入的单词总数。接下来每行包括一个以小写字母组成的单词,单词长度至少是1,至多是20.

输出格式

输出的行数与输入的行数相同。每行输出由相应行输入的单词开始,后面跟着一个空格接下来是相应单词的没有二义性的最短前缀标识符

样例输入

12

carbohydrate

cart

carburetor

caramel

caribou

carbonic

cartilage

carbon

carriage

carton

car

carbonate

样例输出

carbohydrate carboh

cart cart

carburetor carbu

caramel cara

caribou cari

carbonic carboni

cartilage carti

carbon carbon

carriage carr

carton carto

car car

carbonate carbona

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n;
string a[1010];


int main()
{
	
	cin>>n;
	for(int i = 0;i<n;i++)
	{
		cin>>a[i];
	}
	
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<=a[i].size();j++)
		{
			string b = a[i].substr(0,j);
			bool f = true;
			for(int k = 0;k<n;k++)
			{
				if(k!=i&&a[k].substr(0,j)==b)
				{
					f = false;
					break;
				}
			}
			if(f==true||j==a[i].size())
			{
				cout<<a[i]<<" "<<b<<endl;
				break;
			}
		}
	}
	
	
	return 0;
}

最小新整数

题目描述

给定一个十进制正整数n(0<n<1000000000),每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0<k〈m),求生成的新整数最小为多少?例如:n=9128456,k=2,则生成的新整数最小为12456

输入格式

第一行t,表示有t组数据;

接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n,k。

输出格式

t行,每行一个数字,表示从n中删除k位后得到的最小整数。

样例输入

2

9128456 2

1444 3

样例输出

12456

1

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

string a;
int k;


int main()
{
	
	int t;
	cin>>t;
	while(t--)
	{
		cin>>a>>k;
		int n = a.size();
		while(k!=0)
		{
			for(int i = 0;i<a.size();i++)
			{
				if(i==0&&a[i]>a[i+1])
				{
					a = a.substr(1,a.size()-1);
					k--;
				}
				else if(i!=0&&a[i]>a[i-1]&&a[i]>=a[i+1])
				{
					a = a.substr(0,i)+a.substr(i+1,a.size()-1);
					k--;
				}
//				cout<<i<<" "<<a<<" "<<k<<" "<<n<<endl;
//				system("pause");
				if(k==0) break;
			}
			if(k==0) break;
		}
		cout<<a<<endl;
	}
	
	
	
	return 0;
}

寻找平面上的极大点

题目描述

在一个平面上,有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a且y>=b;用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。本题规定:n不超过100,并且不考虑点的坐标为负数的情况。输入格式

输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。

输出格式

按x轴坐标最小到大的顺序输出所有极大点。

输出格式为:(x1,y1),(x2,y2)....(xk,yk)

样例输入

5

1 2 2 2 3 1 2 3 1 4

样例输出

(1,4),(2,3),(3,1)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
	int x,y;
	node(){};
	node(int aaaaa,int bbbbb)
	{
		x = aaaaa;
		y = bbbbb;
	}
};
node a[10010];
int n;


int main()
{
	
	cin>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
	}
	for(int i = 1;i<=n-1;i++)
	{
		for(int j = 1;j<=n-i;j++)
		{
			if(a[j].y<a[j+1].y)
			{
				swap(a[j].x,a[j+1].x);
				swap(a[j].y,a[j+1].y);
			}
			else if(a[j].y==a[j+1].y)
			{
				if(a[j].x<a[j+1].x)
				{
					swap(a[j].x,a[j+1].x);
					swap(a[j].y,a[j+1].y);
				}
			}
		}
	}
	int cnt = 0;
	int ma = -999999999;
	for(int i = 1;i<=n;i++)
	{
//		cout<<a[i].x<<" "<<a[i].y<<endl;
		if(a[i].x>ma)
		{
			ma = a[i].x;
			if(cnt!=0) cout<<",";
			cnt++;
			printf("(%d,%d)",a[i].x,a[i].y);
		}
	}
	
	
	return 0;
}

电池寿命

题目描述

小S新买了一个掌上游戏机,由两节5号电池供电。这些电池寿命也有所不同,有的能使用5个小时,有的可能就只能使用3个小时。如果他只有两个电池,5小时和3小时,那么他只能玩3个小时的游戏,但是如果他有更多的电池,就可以更加充分地利用它们,比如他有三个电池分别能用3、3、5小时,可以先使用两节能用3个小时的电池,使用半个小时后再把其中一个换成能使用5个小时的电池,两个半小时后再把剩下的一节电池换成刚才换下的电池(那个电池还能用2.5个小时),这样总共就可以使用5.5个小时,没有一点浪费。现在已知电池的数量和电池能够使用的时间,请你找一种方案使得使用时间尽可能的长。

输入格式

输入包含多组数据。每组数据包括两行,第一行是一个整数N(2≤N≤1000),表示电池的数目,接下来一行是N个正整数表示电池能使用的时间。

输出格式

对每组数据输出一行,表示电池能使用的时间,保留到小数点后1位。

样例输入

2

3 5

3

3 3 5

样例输出

3.0

5.5

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n;
int a[10010];


int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int sum = 0,ma = -999999999;
		cin>>n;
		for(int i = 1;i<=n;i++)
		{
			cin>>a[i];
			sum += a[i];
			ma = max(ma,a[i]);
		}
		sum -= ma;
		if(ma>sum) cout<<fixed<<setprecision(1)<<(sum*1.0)<<endl;
		else cout<<fixed<<setprecision(1)<<(sum*1.0+ma*1.0)/2<<endl;
		
	}
	
	
	return 0;
}

书架

题目描述

John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。John共有N头奶牛(1≤N≤20,000),每头奶牛有自己的高度Hi(1≤Hi≤10,000),N头奶牛的总高度为S。书架高度B(1≤B≤S<2,000,000,007).为了到达书架顶层,奶牛可以踩着其他奶牛的背,像叠罗汉一样,直到他们的总高度不低于书架高度。当然若奶牛越多则危险性越大。为了帮助John到达书架顶层,找出使用奶牛数目最少的解决方案吧。

输入格式

第1行:空格隔开的整数N和B。

第2~N+1行:第i+1行为整数Hi。

输出格式

能达到书架高度所使用奶牛的最少数目。

输入样例

6 40

6

18

11

13

19

11

输出样例

3

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m;
int a[20010];

bool cmp(int x,int y)
{
	return x>y;
}
int main()
{
	
	cin>>n>>m;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1,cmp);
	int cnt = 0;
	int sum = 0;
	for(int i = 1;i<=n;i++)
	{
		sum += a[i];
		cnt++;
		if(sum>=m) break;
	}
	cout<<cnt;
	
	return 0;
}

师傅加工零件

题目描述

某工厂有n个零件加工的师傅,每位师傅每天能够加工出不同数量的零件。现有m个零件要求一天加工完,请问该工厂最少需要派几个师傅来完成这次零件加工任务,如果安排所有的师傅都参与加工也不能在一天内完成任务,请输出"NO"。

输入格式

第一行有两个整数,用空格隔开;第一个整数代表要加工的总零件个数m(m<=10^6),第二个整数代表工厂的零件加工师傅的数量n(n<=100)。第二行有n个整数,分别代表每个师傅每天能够加工出来的零件数量(每个师傅每天加工的零件数量<=10^4)。

输出格式

工厂在1天时间内加工所有零件需要的师傅数量或者输出NO。

样例

输入复制

10 5

1 3 2 4 2

输出复制

4

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m;
int a[20010];

bool cmp(int x,int y)
{
	return x>y;
}
int main()
{
	
	cin>>m>>n;
	for(int i = 1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+n+1,cmp);
	int cnt = 0;
	int sum = 0;
	for(int i = 1;i<=n;i++)
	{
		sum += a[i];
		cnt++;
		if(sum>=m) break;
	}
	cout<<cnt;
	
	return 0;
}
相关推荐
j_xxx404_2 小时前
蓝桥杯基础--排序模板合集II(快速,归并,桶排序)
数据结构·c++·算法·蓝桥杯·排序算法
月落归舟2 小时前
排序算法---(四)
算法·排序算法
Jordannnnnnnn2 小时前
追赶29,28
c++
童话ing2 小时前
【LeetCode】239.滑动窗口最大值
数据结构·算法·leetcode·golang
:mnong2 小时前
油藏数值模型ReservoirSim 系统设计分析
c++
计算机安禾2 小时前
【数据结构与算法】第13篇:栈(三):中缀表达式转后缀表达式及计算
c语言·开发语言·数据结构·c++·算法·链表
章鱼丸-2 小时前
DAY40 训练与测试规范写法
人工智能·算法·机器学习
简单~2 小时前
C++ 函数模板完全指南
c++·函数模板
·心猿意码·2 小时前
C++ 线程安全单例模式的底层源码级解析
c++·单例模式