考试
这次考得非常不好
话不多说,直接开始题目。
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;
}