小白之旅【2】

· · 休闲·娱乐

开篇

第一册前言

又来,好烦!在作业不多不少的情况下,我仰望天...啊,我想啥呢? \ 画火柴人从幼儿园就开始了,那时是小烂画。每次都叠厚厚一本。\ 2022年又画了 《末日求生》《小白日记1-124》,而今天,我又来搞事了! \ 《小白历险记》 ! \ 这是我第一次写文章类的"漫画"\ 起初就是 小白冲着脑残的精神来到了一个c++世界,开始踏上NOI之旅。\

\Huge 好了,让我们开启旅程吧!

【第一册】 \ 我又回来啦!\ 放暑假(忍不了)\ 第二季开始啦!\ 还是那样脑残\

\Huge 好了,让我们继续旅程吧!

\ \ \ ————

第七章 初出新手峡谷

{ \textcolor{green} {\textbf {达成成就:新的地图!}}}

你已解锁中级地图 \ 中级地图:\

"这又是什么地方?"小白问道。\ 只见旁边是一座圣坛。\ "旁边有宝箱!"小白叫道。\ 只见五个宝箱闪烁着奇异的金光...E跑题了。\ 总共有5个宝箱。\ "金、木、水、火、土!宝箱上有字!"\ 第一个宝箱上出现了一行字:\ "有一个整数数列,请求出第k小的整数!"\ \ 又来到编程题了,快打开宝箱吧! [打开金宝箱](https://www.luogu.com.cn/problem/P1138) \ \ \ \ \ \ \ 相信你已经做完了,成功打开了宝箱!\ \ \ 本人答案: ```cpp #include <iostream> #include <algorithm> using namespace std; int main(){ int a[20005],n,x,q=0; cin>>n>>x; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); if(x>n || x<=0){ cout<<"NO RESULT"; return 0; } if(x==1){ cout<<a[0]; return 0; } for(int i=1;i<n;i++){ if(a[i]!=a[i-1]){ q++; } if(q==x-1){ cout<<a[i]; return 0; } } cout<<"NO RESULT"; return 0; } `````` ### 新函数!sort()函数 sort函数是c++中库algorithm的函数。\ 其作用为将数组排序。\ 格式如下:\ ```cpp \\将a数组的第0位至n-1位排序 sort(a,a+n); `````` 下面还有另一种方法。 ## ${ \textcolor{green} {\textbf {达成成就:打开木宝箱!}}}

"打开了!"\ 随即出现一道光柱。\ "看来打开所有宝箱就可以解锁圣坛了!"\ 接下来是木宝箱。\ 木宝箱上出现了一行字:\ "请你帮忙算谁拿了多少奖学金。"\ \ \ \ 又又来到编程题了,快打开吧!\ 打开\ \ \ \ \ \ 相信你已经做完了,成功又打开了宝箱!\ 答案:

#include <bits/stdc++.h> 
using namespace std; 
int n; 
struct student{ 
    int s,c,t; 
}a[305];

int cmp(student a, student b) {
    if(a.total != b.total) 
        return a.t > b.t;
    if(a.c!=b.c)
        return a.c>b.c;
    return a.s<b.s;
}
int main() {
    cin >> n; 
    for (int i=0;i<n;i++) { 
        int math,english;  
        cin>>a[i].c>>math>>english;
        a[i].t=a[i].c+math+english;
        a[i].s=i+1;
    }
    sort(a,a+n,cmp);
    for (int i=0;i<5;i++){
        cout<<a[i].s<<" "<<a[i].t<<endl;
    }
    return 0;
}

sort()进阶!

sort中可以引用排序规则。只需在第二个需要引用的数后面加一个,再加入自定义函数即可。注意:函数必须是bool类型的。

{ \textcolor{green} {\textbf {达成成就:打开水宝箱!}}}

随即又出现一道光柱。已经集齐两个了。\ 接下来是水宝箱。\ 水宝箱上出现了一行字:\ "请你帮忙算谁拿了最多奖学金。"\ \ \ \ 又又来到编程题了,快打开水宝箱吧!\ 打开\ \ \ \ \ \ 相信你已经做完了,成功又打开了宝箱!\ 答案:

#include <iostream>
#include <algorithm>
using namespace std;

struct student{
    string name;
    char c_g;
    char e_c;
    int end_f;
    int class_f;
    int money__;
    int page;
    int h;
};
struct student a[110];
bool comp(student a,student b){
    if(a.money__>b.money__ || (a.money__ == b.money__ && a.h<b.h)){
        return true;
    }else{
        return false;
    }
}
int main(){
    int n,end=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i].name>>a[i].end_f>>a[i].class_f>>a[i].c_g>>a[i].e_c>>a[i].page;
        a[i].h=i;
        if(a[i].class_f>80 && a[i].c_g=='Y'){
            a[i].money__+=850;
        }
        if(a[i].end_f>80){
            if(a[i].end_f>85 && a[i].e_c=='Y'){
                a[i].money__+=1000; 
            }
            if(a[i].page>=1){
                a[i].money__+=8000;
            }
            if(a[i].class_f>80){
                if(a[i].end_f>85){
                    a[i].money__+=4000; 
                }
            }
            if(a[i].end_f>90){
                a[i].money__+=2000;
            }
        }
        end+=a[i].money__; 
    }
    sort(a,a+n,comp);
    cout<<a[0].name<<endl<<a[0].money__<<endl<<end;
    return 0;
}

{ \textcolor{green} {\textbf {达成成就:打开火宝箱!}}}

随即又出现一道光柱。已经集齐三个了。\ "hoooo!"\ 接下来是火宝箱了。\ 火宝箱上也出现了一行字:\ "有一行数,求怎么拼出来的数最大。"\ \ \ \ 又又又来到编程题了,快打开火宝箱吧!\ 打开\ \ \ \ \ \ 相信你已经做完了,成功又打开了宝箱!\ 答案:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool c(string x,string y){
    return x+y>y+x;
}
int main(){
    int m;
    string a[510];
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>a[i];
    }
    sort(a,a+m,c);
    for(int i=0;i<m;i++){
        cout<<a[i];
    }
    cout<<endl;
    return 0;
}

{ \textcolor{green} {\textbf {达成成就:打开土宝箱!}}}

"呼!"\ "只剩最后一个宝箱了!"\ 来到土宝箱了。\ 土宝箱:\ "有n个地毯,求坐标x,y最上边是几号地毯。"\ \ 来到编程题了,快打开最后一个宝箱吧!\ kuai \ \ \ \ \ \ 相信你已经做完了,成功又打开了宝箱!\ 答案:\

#include <iostream>
using namespace std;
int ditan[10010][4];
int s,x,y;
int main(){
    cin>>s;
    for(int i=1;i<=s;i++){
        for(int j=0;j<4;j++){
            cin>>ditan[i][j];
        }
    }
    cin>>x>>y;
    int i;
    for(i=s;i>0;i--){
        if(x>=ditan[i][0] && y>=ditan[i][1] && x<=ditan[i][0]+ditan[i][2] && y<=ditan[i][1]+ditan[i][3]){
            cout<<i;
            break;
            return 0;
        }
    }
    if(i==0){
        cout<<"-1";
    }
    return 0;
}

多维数组!

多维数组就是在数组中装数组。\ 例:\

int a[100][233];

【hahaah】

第八章 计算大陆

{ \textcolor{green} {\textbf {达成成就:初级密码!}}}

"我们被传送到了计算大陆!"\ 突然,一根柱子从天而降。\ "pong..."\ "差点砸到我了!"\ "请你计算超大数加法和减法!破开密码"\ \ \ \ 又来到编程题了,快解开密码吧!\ 解开1\ 解开2\ \ \ \ \ 相信你已经做完题目了,成功解开了密码!\ 答案(1)c++:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string A,B;
int a[1000],b[1000],c[1000];
int main(){
  cin>>A>>B;
  int len=max(A.length(),B.length());
  for(int i=A.length()-1,j=0;i>=0;i--,j++){
    a[j]=A[i]-'0';
  }
  for(int i=B.length()-1,j=0;i>=0;i--,j++){
    b[j]=B[i]-'0';
  }
  for(int i=0;i<len;i++){
    c[i]+=a[i]+b[i];
    if(c[i]>=10){
      c[i]-=10;
      c[i+1]+=1;
    }
  }
  if(c[len]>0){
    len++;
  }
  for(int i=len-1;i>=0;i--){
    cout<<c[i];
  }
  cout<<endl;
  return 0;
}

答案(2):

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string A,B;
int a[20000],b[20000],c[20000];
bool compare(string A,string B){
    if(A.length()>B.length()){
        return true;
    }else if(B.length()>A.length()){
        return false;
    }if(A>=B){
        return true;
    }else if(B>A){
        return false;
    }
}
int main(){
    cin>>A>>B;
    int len=max(A.length(),B.length());
    for(int i=A.length()-1,j=0;i>=0;i--,j++){
        a[j]=A[i]-'0';
    }
    for(int i=B.length()-1,j=0;i>=0;i--,j++){
        b[j]=B[i]-'0';
    }
    if(compare(A,B)){
        for(int i=0;i<len;i++){
            //c[i]+=a[i]-b[i];
            c[i]+= a[i]-b[i];
            if(c[i]<0){
                c[i]+=10;
                c[i+1]-=1;
            }
        }
    }else{
        cout<<"-";
        for(int i=0;i<len;i++){
            //c[i]+=a[i]-b[i];
            c[i]+= b[i]-a[i];
            if(c[i]<0){
                c[i]+=10;
                c[i+1]-=1;
            }
        }
    }
    for(int i=len-1;i>0;i--){
        if(c[i]==0){
            len--;
        }else{
            break;
        }
    }
    for(int i=len-1;i>=0;i--){
        cout<<c[i]; 
    }
    cout<<endl;
    return 0;
}

高精度!

高精度有四步:\

  1. 输入字符串并倒序转换成整型数组
  2. 循环计算每一位,注意进位
  3. 减法要退位去零,加法要考虑最后一位进位
  4. 倒序输出数组

    loading...

    { \textcolor{green} {\textbf {达成成就:解开锁链!}}}

    "这边有楼梯!"\ ......\ "有许多铁链!"\ 铁链锁着一把钥匙。\ 又是久违的石柱。\ 石柱很轻,但直接砸到了小白头上。\ "A!"\ 石柱:\ "请计算大数a*b!"\ 又来到编程题了,快来解开锁链吧!\ jisuan \ \ \ \ \ \ \ 相信你已经做完了,成功解开了锁链!\ 答案:

    #include<iostream>
    #include<cstdio>
    #include<string>
    const int maxn = 5000;
    using namespace std;
    int a[maxn], b[maxn], c[maxn];
    int main() {
    string A,B;
    cin>>A>>B;
    int lena=A.length(),lenb=B.length();
    for(int i=lena-1;i>=0;i--)
        a[lena-i]=A[i]-'0';
    for(int i=lenb-1;i>=0;i--)
        b[lenb-i]=B[i]-'0';
    for(int i=1;i<=lena;i++){
        for(int j=1;j<=lenb;j++){
            c[i+j-1]+=a[i]*b[j];
        }
    }
    int len=lena+lenb;
    for(int i=1;i<=len;i++){
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    while(c[len]==0)
        len--;
    for(int i=max(1,len);i>=1;i--){
        printf("%d",c[i]);     
    }
    return 0;
    }

    注意

    这里乘法要输出的数组长度一定是输入两个数的长度之和左右。

    { \textcolor{green} {\textbf {达成成就:打开大门!}}}

    "获得了钥匙!"\ 而旁边有一个宝箱。\ "可以打开宝箱了!"\ "里面又是一个密码锁!"\ 上面写着:\ "请求出a/b!"\ \ \ 又来到编程题了,快来解开密码锁吧!\ 解开\ \ \ \ \ \ \ \ \ 相信你已经做完了,成功解开了密码锁!\ 答案:

    #include<iostream>
    #include<cmath>
    #include<string>
    using namespace std;
    const int maxn = 5050;
    int a[maxn],c[maxn],len,flag=0;
    long long b,q;
    string A;
    int main() {
    cin>>A>>b;
    len=A.length();
    for(int i = 0; i <len ; i++)
        a[i] = A[i] - '0';
    for(int i=0;i<len;i++){
        q=q*10+a[i];
        c[i]=q/b;
        q%=b;
    }
    for(int i=0;i<len;i++){
        if(c[i]!=0){
            flag=1;
        }
        if(i==len-1){
            flag=1;
        }
        if(flag==1){
            cout<<c[i];
        }
    }
    return 0;
    }

    a/b

    { \textcolor{green} {\textbf {达成成就:解锁武器!}}}

    "打开了大门!"\ 大门里又是箱子。\ "里面又是一个箱子!"\ "aaaaaaaa!"\ 石柱:\ "请求出\sum_{i = 1}^{n} i! "\ \ \ \ \ \ 又来到编程题了,快来打开箱子吧!\ \ 打开箱子 \ \ \ \ \ \ \ \ 相信你已经做完了,成功打开了箱子!\ 答案:

    #include <iostream>
    #include <string>
    using namespace std;
    int s[155],t[155],ans,n;
    int main() {
    cin>>n;
    t[1]=1;
    for(int i=1;i<= n;i++) {
        for(int j=1;j<=150;j++) {
            t[j]=t[j]*i;
        }
        for(int k=1;k<=150;k++) {
            t[k+1]+=t[k]/10;
            t[k]=t[k]%10;
        }
        for(int k=1;k<=150;k++) {
            s[k]=s[k]+t[k];
            s[k+1]+=s[k]/10;
            s[k]=s[k]%10;
        }
    }
    int flag=0;
    for(int i=150;i>=1;i--) {
        if(s[i]){
            flag=1;
        }
        if(flag){
           cout<<s[i];
        }
    }
    }

    三周月快乐!

    ha

    第九章 斐波小村

    { \textcolor{green} {\textbf {达成成就:进入小村!}}}

    解锁了一把武器!\ "还是一把枪!"\ 走着走着,就进入了一个小村。\ "斐波小村"\

    【loading...】

    村子里空无一人。中心有一个石柱,上面写满了斐波那契数列。\ 地上浮现了一道题:\ "请计算F_n!"\ \ 又来到编程题了,快来解开题目吧!\ kuai\ \ \ \ \ \ \ \ 相信你已经解开题目了!\ \ 答案(自):

    #include <iostream>
    using namespace std;
    int main(){
    long n,ans=1,x=0;
    cin>>n;
    for(long i = 1;i<n;i++){
        long k=ans;
        ans+=x;
        x=k;
    }
    if(n==0){
        cout<<"0.00";
        return 0;
    }
    cout<<ans<<".00";
    return 0;
    }

    斐波那契数列

    斐波那契数列是一种数列。求式为f(n)=f(n-1)+f(n-2)

    { \textcolor{green} {\textbf {达成成就:扒开破网!}}}

    "这中间有洞穴!"\ 走进去,里面是潮湿的石柱。\ 突然,一个网朝小白扑去。\ "A!"小白被扑到在地。\ 而网异常坚固,拔都拔不开。\ 这时,石柱上出现了文字:\ "请你求出斐波纳契数列的第t项。"\ \ 又来到编程题了,快来解开题目吧!\ kuai \ \ \ \ \ \ \ \ 相信你已经解开题目了,解开了网!\ 答案(字):

    #include <iostream>
    using namespace std;
    int fib(int x){
    if(x==1||x==2) return 1;
    else return fib(x-1)+fib(x-2);
    }
    int n,a[100];
    int main() {
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<n;i++){
        cout<<fib(a[i])<<endl;
    }
    return 0;
    }

    { \textcolor{green} {\textbf {达成成就:打开铁门!}}}

    "hoooo!"\ "这里有一个密室!"\ 进入密室,里面是一把铁剑和一个密码锁,旁边有一个铁门。\ "快打开密码锁!"\ 此时,无论怎么密码锁拔都拔不开。\ "石柱又出现了!"\ "小K想爬楼梯,请帮忙算出有多少种走法。"\ \ 又来到编程题了,快来解开题目吧!\ kuai\ \ \ \ \ \ 相信你已经解开题目了,解开了密码锁,打开了铁门!\ 答案:

    #include <iostream>
    using namespace std;
    int main(){
    int n,x,a[100005];
    cin>>n>>x;
    a[0]=1;
    a[1]=1;
    for(int i = 2;i<=n;i++){
        if(i<=x){
            a[i]=(a[i-1]*2)%100003;
        }else{
            a[i]=(2*a[i-1]-a[i-x-1])%100003;
        }
    }
    if(n==0){
        cout<<"0";
        return 0;
    }
    cout<<(a[n]+100003)%100003;
    return 0;
    }

    第十章 陨石洞穴

    { \textcolor{green} {\textbf {达成成就:进入洞穴!}}}

    小白进入了陨石洞穴。\ "好大的洞穴!"\ "这里有一个牌子!"\ "男左女右。"\ "走左边。"\ 前边又有一个牌子。\ "又有一个牌子!"\ 牌子上面写着:"给出n个数,求加起来得到的素数的有多少种?"\ \ \ 又来到八八八八编程题了,快来写出代码吧!\ 快!\ \ \ \ \ \ \ \ \ 相信你已经完成题目了,成功解出了题目!\ 答案(本人):

    #include <iostream>
    using namespace std;
    int n,w[50],a[50],k,ans=0,mm=0;
    bool isprime(int n){
    if(n==2 || n==3){
        return true;
    }
    if(n%2==0 || n==0 || n==1){
        return false;
    }
    for(int i=3;i*i<=n;i+=2){
        if(n%i==0) return false;
    }
    return true;
    }
    int stc(int A[]){
    int sans=0;
    for(int i=0;i<=49;i++){
        sans+=A[i];
    }
    return sans;
    }
    void dfs(int pos,int &he){
    if(pos==n+1){
        if(isprime(he) && stc(a)==k){
            ans++;
        }
        return;
    }
    for(int i=0;i<2;i++){
        a[pos]=i;
        if(a[pos]==1){
            int hes=he+w[pos];
            dfs(pos+1,hes);
        }else{
            dfs(pos+1,he);
        }   
    }
    }
    int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    dfs(1,mm);
    printf("%d",ans);
    return 0; 
    }

    新算法! dfs

    dfs代表深度优先搜索。它按照"一条道走到头"的原理展开搜索并结合回溯。适用于枚举和搜索图和树。基本代码如下:

    void dfs(int pos){
    if(/*跳出条件*/){
        /*结算此结果*/
        return;//回溯
    }
    for(int i=0;i</*道路总数*/;i++){
        dfs(/*pos能到的节点*/);
    }
    }

    { \textcolor{green} {\textbf {达成成就:神秘大门!}}}

    "呼!"\ 在牌子旁突然闪现一座大门。\ "这大门是什么时候出来的?"\ 结果大门被锁了。\ "又来!该怎么打开呢?"\ 就在此时,地上出现了血腥的字体:\ "请帮助机器猫选择要吃的食物。"\ \ \ 又来到编程题了,快来打开大门吧!\ 打开大门\ \ \ \ \ \ \ 相信你已经做完题目了,成功打开了神秘大门!\ 答案(本人):\

    #include <iostream>
    using namespace std;
    int n,w[50],a[50],lo,hi,ans=0,mm=0;
    void dfs(int pos,int &he){
    if(pos==n+1){
        if(he>=lo && he<=hi){
            ans++;
        }
        return;
    }
    for(int i=0;i<2;i++){
        a[pos]=i;
        if(a[pos]==1){
            he+=w[pos];
            if(he<=hi){
                dfs(pos+1,he);
            }
            he-=w[pos];
        }else{
            dfs(pos+1,he);
        }   
    }
    }
    int main(){
    scanf("%d%d%d",&n,&lo,&hi);
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    dfs(1,mm);
    printf("%d",ans);
    return 0; 
    }

    { \textcolor{green} {\textbf {达成成就:大熊突袭!}}}

    第十一章 史诗山洞

    { \textcolor{green} {\textbf {达成成就:打开石门!}}}

    { \textcolor{green} {\textbf {达成成就:打开石门!}}}

    { \textcolor{green} {\textbf {达成成就:打开石门!}}}

    第十二章 难题开始

    { \textcolor{green} {\textbf {达成成就:打开石门!}}}

    小白之旅2完结啦!目前行数:877,字数:13308。感谢收看!

小白之旅3