问题 A: 剪纸片
时间限制: 1 Sec 内存限制: 128 MB
题目描述
这是一道简单的题目,假如你身边有一张纸,一把剪刀,在H-star的比赛现场,你会这么做:
1. 将这张纸剪成两片(平行于短边剪开);
2. 将其中一片剪成一个圆,作为圆柱的底面;
3. 纸的另一片的一边沿着圆的周长将圆围起来,直到围成一圈,形成一个无盖的圆柱体。需要注意的是,纸片可能会有重叠部分。
聪明的你机智的你喜欢思考的你这时候就开始想,一张纸片按上述方式所组成的圆柱的最大体积是多少呢?请你用编程解决这个问题。
输入
输入第一行包含一个数字t代表接下来有t组数据;
接下来的t行,输入两个数字w, h(1 ≤ w ≤ h ≤ 100),分别代表纸片的宽和高。
输出
对每一组数据输出纸片所能构成的最大圆柱体的体积v(保留小数点的后三位小数)。
样例输入
3
10 10
10 50
10 30
样例输出
54.247
785.398
412.095
比较坑的是,PI必须用acos(-1)表示
这一题还是蛮简单的,可以算是纯数学问题,在这里就不赘述了,直接上代码
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
double PI = acos(-1);
double Min(double a, double b)
{
return a < b ? a : b;
}
double Max(double a, double b)
{
return a > b ? a : b;
}
int main()
{
//freopen("6.in", "r", stdin);
//freopen("6.out", "w", stdout);
double w, h, r, ans1, ans2, ans;
int t;
cin >> t;
while (t--)
{
scanf("%lf%lf", &w, &h);
r = Min(w / 2.0, h /(2.0 * PI + 2.0));//以w为圆柱的高
ans1 = PI * r * r * w;
r = Min(w / (2.0 * PI), h / 3.0);
ans2 = PI * r * r * (h - 2.0 * r);//以h-2r为圆柱的高
ans = Max(ans1, ans2);
printf("%.3lf\n", ans);
}
return 0;
}
问题 B: 废品收集记
时间限制: 1 Sec 内存限制: 128 MB
题目描述
敲代码不是唯一的出路,但是假如H-star题目太难了,让你放弃了以后当程序员的念头,放弃身边的那个Ta,那么你就有可能去捡破烂,假如你去捡破烂,就会碰到下述问题:
在河海有n个垃圾桶,每个垃圾桶里面都有价值为m,体积为b的废品。但是你的背包体积只有V,为了赚更多钱,为了身边的Ta更幸福,你每一次捡破烂,都希望自己体积为V的背包里装的废品价值尽量多。
所以你又想起你曾经敲过的代码,你决定写一个程序解决这个问题。
输入
输入一个数字t,表示有t组数据:
每一组数据有三行:
第一行:输入两个数字n,V(n <= 1000, V <= 1000);
n表示垃圾桶的数量,V表示背包的容量
第二行:输入包括n个数字,代表每个垃圾桶中废品的价值m
第三行:输入包括n个数字,代表每个垃圾桶中废品需要占用的背包的容量b
输出
输出你每次出去捡破烂背包所能装下破烂的最大价值(保证每次输出数据都在整形范围内)。
样例输入
1
5 10
1 2 3 4 5
5 4 3 2 1
样例输出
14
这是一道01背包的题目,想要了解01背包的,这边有一个博客的地址:http://www.cnblogs.com/xy-kidult/archive/2013/03/25/2970313.html
将问题一般化;
#include<stdio.h>
#include<string.h>
#define M 1009
typedef struct pack
{
int cost;
int val;
}PACK;
int main()
{
int cas,n,v,i,j;
int f[M];
PACK a[M];
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&v);
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
scanf("%d",&a[i].val);
for(i=1;i<=n;i++)
scanf("%d",&a[i].cost);
for(i=1;i<=n;i++)
for(j=v;j>=a[i].cost;j--)
if(f[j]<f[j-a[i].cost]+a[i].val)
f[j]=f[j-a[i].cost]+a[i].val; //01背包状态方程
printf(