物联网学生科协第三届H-star现场编程比赛

问题 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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值