Stay Hungry,Stay Foolish!

#C. 加工制作模型

#C. 加工制作模型

【问题描述】

由苏州市科学技术协会创办的公益性质的青少年科学工作室,旨在通过参与、实践、体验的过程培养青少年的动手能力及创新意识。今年的夏令营安排了一个让营员动手实践的活动项目,要求利用该工作室提供的锯床和材料在辅导老师的指导下加工制作出各种不同的模型。

活动时两名营员组成一小组制作N个模型。制作每件模型需一定时间,且只能由一人完成。例如N=4时,四件模型完成的时间分别为:8,11,13,21分钟,此时二人有多种完成的方案:

方案一:A 制作前3件用时32分钟,B制作第4件用时21分钟,两人总的完成时间为32分钟;

方案二:A 制作1、4件用时29分钟,B制作2、3件用时24分钟,两人总的完成时间为29分钟。

在确定了N及每件模型制作时间后,现在请你找出一种完成时间最少的方案。

本题模型制作时间的数据根据输入的初始数字s按照以下算法生成:

for i=1,2,…,n

s←(s*345) mod 19997

第i个模型的制作时间的数字为(s mod 200)+1

【输 入】两个整数n(表示模型个数),s(数据生成器的初始数值),2≤n≤100,1≤s≤19997,数与数之间用空格分隔。

【输 出】一个整数(表示最少用时)。

【样例输入】4 7

【样例输出】197

【样例说明】生成的4个模型的时间分别为 16 99 98 104。

思路

使用bitset容器,

https://www.cnblogs.com/fusiwei/p/11720118.html

https://zhuanlan.zhihu.com/p/620826333

https://zhuanlan.zhihu.com/p/607895839

Code

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,s;
    
    cin >> n >> s;
    vector<int> a(n+1);
    
    for(int i=1; i<=n; i++){
        s = (s*345) % 19997;
        a[i] = s%200 + 1;
        cout << "a[" << i << "] = " << a[i] << endl;
    }
    
    bitset<20005> B(0);
    B.set(0);
    
    for(int i=1; i<=n; i++){
        B |= B << a[i];
    }
    
    cout << B.to_string() << endl;
    
    int sum = accumulate(a.begin(), a.end(), 0);
    cout << "sum =" << sum << endl;
    
    for(int j=(sum+1)/2; j<20005; ++j){
        if (B.test(j)){
            cout << j << endl;
            break;
        }
    }
    
    return 0;
}

 

posted @ 2023-04-20 10:05  lightsong  阅读(77)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel