zoukankan      html  css  js  c++  java
  • 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
    ",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

  • 相关阅读:
    第十六天-面向对象02-成员
    第十五天-面向对象01
    第十四天-内置函数
    第十三天-生成器
    第十二天-函数名 迭代器
    第十一天-函数进阶
    第十天-初识函数
    第九天- 文件操作 r w a 文件复制/修改
    objectives-c基本语法。
    今天开始了objective-c的学习!
  • 原文地址:https://www.cnblogs.com/qmings/p/12203060.html
Copyright © 2011-2022 走看看