2020 1 16 qbxt tg突破营day1下午模拟考试

迷宫
【问题描述】
n*m的迷宫,迷宫中有k种钥匙,每个格子有一个整数x,如果x=0说明可以任意到达,|x|>k代表不允许到达。x>0代表该位置有第x种钥匙,捡起地上的钥匙需要花费1步。x<0代表到达该位置需要第-x种钥匙,开门不需要时间,问从左上角走到右下角最少需要多少步?(数据保证左上角是0)
【输入格式】
第一行三个正整数n,m,k
接下来n行,每行m个整数表示地图
【输出格式】
输出一个整数,表示从左上角走到右下角最少需要多少步,若不能到达输出-1.
【样例输入】
3 5 2
0 0 0 0 0
2 3 0 0 -1
3 1 -2 3 0
【样例输出】
14
【数据解释】
先拿到第2把钥匙,然后再拿第3把钥匙
【数据规模与约定】
20% n,m<=10 k<=2
另30% n,m<=1000 k=0
100% n,m<=1000 k<=5

背包
【问题描述】
给定n个背包和m个物品,问使用这n个背包最多能装多少个物品
【输入格式】
第一行两个正整数n,m
第二行n个数 a1,a2,…,an,表示背包的容量
第三行m个数 b1,b2,…,bm,表示物品的体积
【输出格式】
输出一个整数,表示使用这n个背包最多能装多少个物品。
【样例输入】
4 9
30 40 50 25
15 16 17 18 19 20 21 24 30
【样例输出】
7
【数据规模与约定】
20% n<=5,m<=10
40% n<=10,m<=20
60% n<=20,m<=20
80% n<=20,m<=1000
100% n<=50,m<=1000,ai<=10000,bi<=10000

T2

其实是一道非常简单的题,因为辣鸡竟然听懂了
一开始思路是这样的:容量大的背包多装几个小点的物体,容量较小的背包装一个的话尽量装比较大的物体。其实好像是有点道理的。
老师讲的正解:

二分答案加深搜

显然答案的区间是[0,m]。
这里的答案判定函数其实分为两个部分。
首先是判定前ans小的物体的体积是否超过了总容量。
再就是通过总容量-前ans小物体的总体积得出最大的浪费的容量数(总体积最小了,总容量不变,浪费的一定是最大的)通过对浪费的容积进行dfs,看看浪费容积数是否超过最大容积数。
好像就酱了⑧
附上老师旳正解

#include<queue>
#include<cstdio>
#include<algorithm>
#define N 1050
using namespace std;
int n,m,bag[N],v[N],all,sum;
int flag;
void dfs(int x,int use)
{
	if(flag)return;
	if(use<0)return;
	if(x==0)
	{
		flag=1;
		return;
	}
	for(int i=1;i<=n;i++)
	if(bag[i]>=v[x])
	{
		bag[i]-=v[x];
		if(bag[i]<v[1])
			dfs(x-1,use-bag[i]);
		else
			dfs(x-1,use);
		bag[i]+=v[x];
	}
}
bool check(int x)
{
	int haha=0;
	for(int i=1;i<=x;i++)
	haha+=v[i];
	if(haha>sum)return 0;
	all=x;
	flag=0;
	dfs(all,sum-haha);
	return flag;
}
int main()
{
	freopen("bag.in","r",stdin);
	freopen("bag.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&bag[i]);
		sum+=bag[i];
	}
	sort(bag+1,bag+n+1);
	for(int i=1;i<=m;i++)
	scanf("%d",&v[i]);
	sort(v+1,v+m+1);
	int l=0,r=m,ans=0;
	while(l<=r)
	{
		int mid=l+r>>1;
		if(check(mid))ans=mid,l=mid+1;
		else r=mid-1;
	}
	printf("%d\n",ans);
}

停车
【问题描述】
市中心有一个环形的停车场,编号1到n,现在有m个车要停,停在每个位置会有不同的费用。为了方便,不允许两辆车停在相邻的位置,请问停好所有车的最小花费是多少?
【输入格式】
第一行包含两个正整数n, m,保证n>=2m-1
第二行包含n个正整数,表示停在i位置的费用
【输出格式】
输出一个整数,表示停好所有车的最小花费是多少
【样例输入】
7 3
1 2 3 4 5 6 7
【样例输出】
9
【样例说明】
停在1 3 5
【数据规模与约定】
20% n<=10
40% n<=100
60% n<=1000
100% n<=100000 ai<=10000

posted @ 2020-01-16 20:12  qmings  阅读(152)  评论(0编辑  收藏  举报