2020年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第1题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第1题)

第1题

(分数背包)小 S 有 n 块蛋糕,编号从 1 到 n。第 i块蛋糕的价值是 w i w_i wi,体积是 v i v_i vi。他有一个大小为 B的盒子来装这些蛋糕,也就是说装入盒子的蛋糕的体积总和不能超过 。他打算选择一些蛋糕装入盒子,他希望盒子里装的蛋糕的价值之和尽量大。

为了使盒子里的蛋糕价值之和更大,他可以任意切割蛋糕。具体来说,他可以选择一个 a(0<a<1),并将一块价值是 w,体积为 v的蛋糕切割成两块,其中一块的价值是 a×w,体积是 a×v,另一块的价值是(1−a)×w,体积是 (1−a)×v。他可以重复无限次切割操作。

现要求编程输出最大可能的价值,以分数的形式输出。

比如 n=3,B=8,三块蛋糕的价值分别是 4,4,2,体积分别是 5,3,2。那么最优的方案就是将体积为 5的蛋糕切成两份,一份体积是 3,价值是 2.4,另一份体积是 2,价值是 1.6,然后把体积是 3 的那部分和后两块蛋糕打包进盒子。最优的价值之和是 8.4,故程序输出 42 5 \frac{42}{5} 542。

输入的数据范围为:1≤n≤1000,1≤B≤105,1≤ w i , v i w_i,v_i wi,vi≤100。

提示:将所有的蛋糕按照性价比 w i v i \frac{w_i}{v_i} viwi 可从大到小排序后进行贪心选择。

试补全程序。

cpp 复制代码
#include <cstdio>
using namespace std;
 
const int maxn = 1005;
 
int n, B, w[maxn], v[maxn];
 
int gcd(int u, int v) {
    if (v == 0)
        return u;
    return gcd(v, u % v);
} 
 
void print(int w, int v) {
    int d = gcd(w, v);
    w = w / d;
    v = v / d;
    if (v == 1)
        printf("%d\n", w);
    else
        printf("%d/%d\n" w, v);
}
void swap(int &x, int &y) {
    int t = x; x = y; y = t;
}
 
int main() {
    scanf("%d %d" &n, &B);
    for (int i = 1; i <= n; i ++) {
        scanf("%d %d", &w[i], &v[i]);
    }
    for (int i = 1; i < n; i ++)
        for (int j = 1; j < n; j ++)
            if (①) {
                swap(w[j], w[j + 1]);
                swap(v[j], v[j + 1]);
            }
    int curV, curW;
    if  (②) {
        ③
    } else {
        print(B * w[1] , v[1]);
        return 0;
    }
    for (int i = 2; i <= n; i ++)
        if (curV + v[i] <= B) {
            curV += v[i];
            curW += w[i];
        } else {
            print (④);
            return 0;
        }
    print(⑤);
    return 0;
}
  1. ①处应填( )

    A. w[j] / v[j] < w[j+1] / v[j+1]

    B. w[j] / v[j] > w[j +1] / v[j+1]

    C. v[j] * w[j+1] < v[j+1] * w[j]

    D. w[j] * v[j+1] < w[j+1] * v[j]

  2. ②处应填( )

    A. w[1] <= B

    B. v[1] <= B

    C. w[1] >= B

    D. v[1] >= B

  3. ③处应填( )

    A. print(v[1],w[1]); return 0;

    B. curV = 0; curW = 0;

    C. print(w[1], v[1]); return 0;

    D. curV = v[1]; curW = w[1];

  4. ④处应填( )

    A. curW * v[i] + curV * w[i], v[i]

    B. (curW - w[i]) * v[i] + (B - curV) * w[i], v[i]

    C. curW + v[i], w[i]

    D. curW * v[i] + (B - curV) * w[i], v[i]

  5. ⑤处应填( )

    A. curW,curV

    B. curW, 1

    C. curV, curW

    D. curV, 1

答案及题解
  1. ①处应填 D,因为需要按性价比从大到小排序,比较时用交叉乘法避免浮点误差。
  2. ②处应填 B,判断第一个蛋糕的体积是否不超过背包容量,若是则先完整取走。
  3. ③处应填 D,初始化当前已取体积和价值为第一个蛋糕的完整值。
  4. ④处应填 D,计算取部分蛋糕时的总价值分子,分母为当前蛋糕的体积。
  5. ⑤处应填 B,所有蛋糕完整取完后输出总价值,分母为1。

专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
学编程的闹钟1 小时前
安装GmSSL3库后用VS编译CMake源码
c语言·c++·ide·开发工具·cmake·visual studio
想放学的刺客10 小时前
整理了120道单片机嵌入式面试题与答案,覆盖了硬件电路和C语言等核心领域。
c语言·c++·stm32·单片机·嵌入式硬件·mcu·51单片机
普通网友11 小时前
多协议网络库设计
开发语言·c++·算法
努力努力再努力wz11 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法
汉克老师12 小时前
GESP2024年3月认证C++二级( 第二部分判断题(1-10))
c++·循环结构·分支结构·gesp二级·gesp2级
daxi15012 小时前
C语言从入门到进阶——第9讲:函数递归
c语言·开发语言·c++·算法·蓝桥杯
Polaris北13 小时前
第二十七天打卡
开发语言·c++·算法
学无止境_永不停歇14 小时前
十一、C++11列表初始化、右值引用和移动语义
开发语言·c++
mjhcsp15 小时前
C++ 背包DP解析
开发语言·c++