迷宫
【问题描述】
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