3月13日考试

考试

这次考得非常不好

话不多说,直接开始题目。

A. 午餐费
题目描述

现要对某班学生进行N天培训,该班所有学生都订了N天的午餐,所以我们知道他们每天要花多少钱。现在该班班主任需要决定如何使用班费。由于钱有限,他们不可能每天都吃免费午餐。因此,每天班主任可以选择自己支付或使用班费支付当天午餐费。当然,班主任比较小气,希望尽可能多地花掉班费,但是他太忙了,请你帮他计算他最多能够花多少班费。
玄学
第一次想用贪心做
结果 在这里插入图片描述

代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 10005;
typedef long long LL;
LL a[M];
LL n,m;
int ans = 0;
int main()
{
	while(scanf("%lld %lld",&n,&m) != EOF){
		for(int i = 1;i <= n;i++){
			scanf("%lld",&a[i]);
		}
		ans = 0;//初始化 
		for(int i = 1;i <= n;i++){
		if(a[i] < m){
			m -= a[i];
			ans += a[i]; 
		}
		else{
			break;
		}
		}
		printf("%d",ans);
	}
	return 0;
}
当然,这水不了几分。
因为不一定是小的就拿。
所以改了改
用了dfs
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[35],b[35];
bool cmp(int x,int y) {
	return x > y; 
}
long long int ans = 0;
void f(int x,int sum,long long int Ans) {
	if(Ans+b[x] <= ans) return;
	if(ans == m) return;
	if(x > n) {
		ans = max(Ans,ans);
		return;
	}
	if(a[x] == sum) {
		ans = m;
		return;
	}
	if(a[x] < sum) f(x+1,sum-a[x],Ans+a[x]);
	f(x+1,sum,Ans);
}
int main() {
	freopen("lunch.in","r",stdin);
	freopen("lunch.out","w",stdout);
	while(scanf("%d %d",&n,&m) != EOF) {
		ans = 0;
		for(int i = 1;i <= n;i++) {
			scanf("%d",&a[i]); 
		}
		sort(a+1,a+n+1,cmp);
		for(int i = n;i >= 0;i--) {
			b[i] = b[i+1]+a[i];
		}
		f(1,m,0);
		printf("%d\n",ans);
	}
	return 0;
} 

B. 生日快乐
题目描述

windy的生日到了,为了庆祝生日,
他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。
现在包括windy,一共有 N 个人来分这块大蛋糕,
要求每个人必须获得相同面积的蛋糕。
windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),
并且必须把这块蛋糕切成两块。
这样,要切成 N 块蛋糕,
windy必须切 N-1 次。
为了使得每块蛋糕看起来漂亮,
我们要求 N块蛋糕的长边与短边的比值的最大值最小。
你能帮助windy求出这个比值么?

输入输出格式

输入格式

包含三个整数,X Y N。1 <= X,Y <= 10000 ; 1 <= N <= 10

输出格式

包含一个浮点数,保留6位小数。

这道题与之前做过的巧克力棒
极其的相似
只是要求每人分到的相同
用一个暴力就可以过
我想水分,但
在这里插入图片描述
改了一下,代码如下:

#include<bits/stdc++.h>
using namespace std;
int x,y,z;
double dfs(double x,double y,int n){
	if(n==1)
		return max(x,y)/min(x,y);
	double ans = 1000000007;
	for(int i=1;i<=n/2;i++){
		ans = min(ans,max(dfs(x,y/n*i,i),dfs(x,y-y/n*i,n-i)));
		ans = min(ans,max(dfs(x/n*i,y,i),dfs(x-x/n*i,y,n-i)));
	}
	return ans;
}
int main()
{
	freopen("birthday.in","r",stdin);
	freopen("birthday.out","w",stdout);
	cin>>x>>y>>z;
	printf("%.6lf",dfs(x,y,z));
	return 0;
 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值