新生37

奖品,密码,吃萝卜

奖品:

题目描述

托塔李天王的三太子那吒,本领高强,他要赶在奥林匹克运动会之际,开一个头脑 奥林匹克比赛,获胜者的奖品就是经过提炼后的“氦-3”晶结体;该物质在月球上大量 存在,是一种无色、无味的氦气同位素,它在核聚变研究中有重要作用。氦-3还是一种 绝对清洁的能源,因为它本身不带放身性,因此不会产生任何放射性废料。可是如果从 月球上将该晶体运回地球呢?那吒说:用我的肚兜吧!当然他的肚兜易受太阳风等因素 的影响,载重量不能超过k(1<=k<=100000),超过这个值,肚兜就不会飞了;这个k值 那吒会告诉你的,同时还会告诉你每一个晶体的重量。 你的任务是使这个肚兜一次能运回更多的晶体。

输入

有两行 第一行有两个正整数n和k,用一个空格隔开。表示有n个晶体,肚兜最大载重量为k。 第二行有n个不超过10000的正整数,分别表示n个晶体的重量,数与数之间用一个空 格隔开。

输出

只有一行,该行只有一个正整数,表示那吒的肚兜一次能运回 的晶体重量的最大值。

样例输入 Copy

5 15 
2 4 4 8 10

样例输出 Copy

14

提示

[数据限制]
40%的数据: 1<=n<=20
100%的数据: 1<=n<=100
这个题就是01背包,模板题:
一共n个物品,有选和不选的两种可能,f[j]是背包容量为j时的最优解,不选:那重量和上一个的最优解是一样的;选上一个加选的这个f[j-v[i]]+v[i];
不清楚可以拿二维模拟一下即可
复制代码
#include<iostream>
using namespace std;
long long int f[100010],v[100010],w[100010];
int main(){
    long long int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>v[i];for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=v[i];j--)
        {
            f[j]=max(f[j],f[j-v[i]]+v[i]);
        }
    }
    cout<<f[m]<<endl;
    return 0;
}
复制代码

密码:

题目描述

在浩浩茫茫的苍穹深处,住着玉帝和他的神仆们,他们闲谈着下界的凡人俗事, 对人世间表现的聪明,大加赞赏。今天他们正在观赏大地风光人情之际,忽然从遥远 的东海之滨传来一阵欢笑声,玉帝纵目望去,只见镇海中学内聚集了全宁波的中小学 精英学生,他们要干什么呢? 原来他们都在做一种破译密码的游戏,人们发现:一根密码棒上的数字加上另一 根密码棒上的数字,就是开启天庭粮库密码乌锁的密码。 如:1233+67122=68355,则68355就是一组就效的密码。 “太简单了!”人们高呼起来,继续探索着。 “这不过是早期的密码系统而已。”玉帝轻蔑地环顾神仆们说道。 可是,当人们演算了139513+3344=142857后,玉帝的神色愈来愈不对了,要知 道,142857是一个特别的数字,这可是天庭的机密,是谁将这些机密泄露给世人呢? 于是,玉帝搬出一张牌,对司粮库主管神农氏说:“将这张牌打出去,看看他们 还逞能不?” 这是天庭中一张王牌,但平凡的很,只不过将密码的位数增大到不超过200位而已, 可是难就难在你看到文件:输入两个数后,必须在1秒钟内将密码求出,否则这组密码就失效了。 玉帝还是仁慈的,没有将更难的牌打出来,他想到天庭的粮食恩赐人间,但他绝 不会给那些不动脑子的人。 现在请你解开天庭司粮库密码锁的密码,帮助人们获得天庭恩赐的粮食。

输入

共有两行,每行一个整数

输出

只有一行,该行只有一个整数,为输入的两个正整数之和

样例输入 Copy

1233
67122

样例输出 Copy

68355
这题高精度加:
复制代码
#include<iostream>//高精度加法 
#include<cstring>
using namespace std;
int main(){
    char ch1[1100],ch2[1100];
    int la,lb,lc,i,a[1100],b[1100],c[1100];
    cin>>ch1>>ch2;
    la=strlen(ch1);
    lb=strlen(ch2);
    lc=la>lb?la:lb;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for(i=0;i<la;i++)
    {
        a[la-i-1]=ch1[i]-'0';
    }
    for(i=0;i<lb;i++)
    {
        b[lb-i-1]=ch2[i]-'0';
    }
    memset(c,0,sizeof(c));
    for(i=0;i<lc;i++)
    {
        c[i]=a[i]+b[i]+c[i];
        if(c[i]>=10)
        {
            c[i+1]=1;
            c[i]-=10;
        }
    }
    if(c[lc]>0)
    {
        lc++;
    }
    for(i=lc-1;i>=0;i--)
    {
        cout<<c[i];
    }
    return 0;
}
复制代码

 吃萝卜:

题目描述
在一个神奇的国度里,有一只编程兔,它每天都写很多的代码,各种编程语言如pascal、c、c++、java、basic等等它都了如指掌,各种算法也都已经滚瓜乱熟了。小花是它的好朋友,经常和它一起玩耍。
某一天,小花给编程兔送来了很多的萝卜。编程兔很开心,决定把它的萝卜和其它的小兔子一起分享。小花共计送来了n袋萝卜(编号1到n),每袋里面都有一定数量的萝卜。小兔子共计有m只,兔子们都很守规矩,按照编号1到m依次排好领取萝卜,萝卜按照编号从小到大的顺序依次发放(也就是编号小的兔子领取前面的萝卜,编号大的兔子领取后面的萝卜,萝卜一定要分完,不能有剩余),每只兔子都只能领取连续的若干袋萝卜,每只兔子至少领取一袋萝卜,一袋萝卜也只能分给一只兔子,不能分给两只以上的兔子。
编程兔希望萝卜尽量能分的平均一点(否则小兔子们要不开心的_),也就是它希望得到萝卜最多数量的兔子的萝卜要最少。这个问题对于编程兔来说很简单,亲爱的同学们,你们会么?

输入
第一行是两个正整数n和m,表示萝卜的袋数和兔子的数量。
第二行是n个正整数,表示每袋萝卜的数量。
输出
输出只有一行一个整数,表示得到萝卜最多的那只兔子最少可以得到的萝卜数量。

样例输入 Copy
9 3
1 2 3 4 5 6 7 8 9
样例输出 Copy
17

这个题看了一位大佬的博客,豁然开朗:

(33条消息) 吃萝卜 解题报告【二分答案】_xiaoruihang的博客-CSDN博客

这个题求的是最小的最大值,像什么最小的最大值,最大的最小值用二分来写

就是用二分来查找你要的那个答案

因此可以看出,此题的用意是让我们查找到一个合适的数,成为最大值,并且让这个最大值最小。

所以需要使用二分查找

 两个边界值一定要确定好

复制代码
#include<iostream>
using namespace std;
int n,m;
const int N=1e5+10;
int a[N];
int check(int x)
{
    int sum=0,cnt=0;
    for(int i=0;i<n;i++)
    {
        sum+=a[i];
        if(sum>x)
        {
            sum=a[i];
            cnt++;
        }
    }
    cnt++;
    if(cnt>m)
        return 0;
    else
        return 1;
    
}
int main(){
    cin>>n>>m;
    int l=0,r=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        l=max(l,a[i]);
        r+=a[i];
    }
    while(l<r)
    {
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
    return 0;
}
复制代码

 

posted @   小志61314  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示