浙江邮电职业技术学院人工智能学院2024级新生杯程序设计竞赛解题报告

浙江邮电职业技术学院人工智能学院2024级新生杯程序设计竞赛-by zzz12138

A:小猿口算大赛

#include <iostream>

typedef long long LL;

using namespace std;

int main()

{

    /* 水题*/

    LL a,b;

    for(int i=0;i<10;i++){

        cin>>a>>b;

        if(a>b)cout<<">\n";

        else if(a<b)cout<<"<\n";

        else cout<<"=\n";

    }

    cout<<"caijiuduolian\n";

    return 0;

}

B:九九乘法表

#include<iostream>

using namespace std;

int main()

{   

    /* 简单题

     * 使用双重循环输出即可

     * 注意不要多输出制表符,制表符只在两个算式之间存在

     *

     * 或者也可提前写好输出的字符串,在使用循环进行输出(具体可参考代码二)

     * */

    int n;

    cin>>n;

    if(n>0&&n<10){

        for (int i = 1; i <= n; i++)

        {

            for(int j = 1;j<=i; j++){

                cout<<i<<'*'<<j<<'='<<i*j;

                if(j!=i)cout<<"\t";

            }

            cout<<"\n";

        }

    }

    else if(n<=0){

        cout<<"n is too small!\n";

    }

    else {

        cout<<"n is too large!\n";

    }

    return 0;

}

/*

//代码二

#include<iostream>

using namespace std;

int main(){

    int n;

    cin>>n;

    char str[9][1000]={ {"1*1=1\n"},

                        {"2*1=2\t2*2=4\n"},

                        {"3*1=3\t3*2=6\t3*3=9\n"},

                        {"4*1=4\t4*2=8\t4*3=12\t4*4=16\n"},

                        {"5*1=5\t5*2=10\t5*3=15\t5*4=20\t5*5=25\n"},

                        {"6*1=6\t6*2=12\t6*3=18\t6*4=24\t6*5=30\t6*6=36\n"},

                        {"7*1=7\t7*2=14\t7*3=21\t7*4=28\t7*5=35\t7*6=42\t7*7=49\n"},

                        {"8*1=8\t8*2=16\t8*3=24\t8*4=32\t8*5=40\t8*6=48\t8*7=56\t8*8=64\n"},

                        {"9*1=9\t9*2=18\t9*3=27\t9*4=36\t9*5=45\t9*6=54\t9*7=63\t9*8=72\t9*9=81\n"} };

    if(n>0&&n<10){

        for (int i = 0; i < n; i++)

        {

            for(int j=0;str[i][j]!='\0';j++){

                cout<<str[i][j];

            }

        }

    }

    else if(n<=0){

        cout<<"n is too small!\n";

    }

    else {

        cout<<"n is too large!\n";

    }

    return 0;

}

*/

C:空心菱形

#include<iostream>

using namespace std;

int main()

{

    /* 简单题

     * 使用双重循环输出菱形

     * */

    int n;

    char c;

    while(1){

        cin>>n;

        if(n==0)break;

        cin>>c;

        for(int i=1;i<(n+1)/2;i++){

            for(int j=0;j<(n+1)/2-i;j++){

                cout<<' ';

            }

            cout<<c;

            for(int j=1;j<(i-1)*2;j++){

                cout<<' ';

            }

            if(i!=1)cout<<c;

            cout<<'\n';

        }

        for(int i=(n+1)/2;i<=n;i++){

            for(int j=0;j<i-(n+1)/2;j++){

                cout<<' ';

            }

            cout<<c;

            for(int j=1;j<(n-i)*2;j++){

                cout<<' ';

            }

            if(i!=n)cout<<c;

            cout<<'\n';

        }

    }

    return 0;

}

D:zmx下象棋

#include <iostream>

#include <cmath>

using namespace std;


int main()

{

    int x1,y1,x2,y2;

    /* 中档题

     * 输出小兵需要走的步数

     * 小兵行走的步数为横坐标之差加上纵坐标之差。

     * 输出Error的情况

     * 当终点在小兵坐标下方时小兵必定无法走到输出"Error!"

     * 当终点在我方棋盘上时小兵不能横向行走,此时横坐标不相等即可输出"Error!"*/


    int t;

    char c;

    cin>>t;

    while(t--){

        cin>>c>>x1>>c>>y1>>c;

        cin>>c>>x2>>c>>y2>>c;

        if(y2<=4&&x2!=x1||y2<y1){

            cout<<"Error!\n";

        }

        else{

            cout<<y2-y1+abs(x1-x2)<<'\n';

        }

    }

    return 0;

}

E:比例简化

#include <iostream>

using namespace std;

int gcd(int a, int b) {

    if (b == 0) return a;

    return gcd(b, a % b);

}

int main(){


    /* 思维题

     * 中档题

     * 因A/B<=L<=100

     * 直接枚举答案,跟据题意进行筛选即可*/

    double A,B,L,a,b,res=1000000;

    cin>>A>>B>>L;

    double C=A/B;

    for(int i=0;i<=L;i++){

        for(int j=1;j<=L;j++){

            double temp=(double)i/j;

            if(temp-C<0)continue;

            if(gcd(i,j)!=1)continue;

            if(temp-C<res)res=temp-C,a=i,b=j;

        }

    }

    cout<<a<<' '<<b<<'\n';

    return 0;

}

F:yyx数树叶

#include <iostream>

using namespace std;

int main(){

    /* 数学推理题

     * 中档题

     * 直接计算会超过LL范围,所以不能直接计算

     * 注意到x^x与x的奇偶性一致,所以此题的意思等价于求k加到n的值sum的奇偶性

     * 此时如果使用for循环计算仍然可能爆超时,所以直接用等差数列求和公式计算其和sum

     * 再判断一下sum的奇偶性即可*/

    int t,n,k;

    cin>>t;

    while(t--){

        cin>>n>>k;

        int sum=0;

        sum=(n-k+1+n)*k/2;

        if(sum%2==0)cout<<"YES\n";

        else cout<<"NO\n";

    }

    return 0;

}

G:cxk

#include <iostream>

using namespace std;

int main()

{

    int x;

    cin>>x;

    if(x>=250) { cout<<

                     "                &.-@@\n"

                     "               &....@@\n"

                     "                .-..=\n"

                     "                 ..-\\.\n"

                     "                $$$$$$$-\n"

                     "     %#    $$$$ $$$$B$ $$$$$\n"

                     "  ..####$$$$$$$ $@$B$$ $$$$$$$$\n"

                     "  #######$$$$$$B@@@$$$$$$$$$$$$$$\n"

                     "  #######       .$$$$$$ $$$$$= $$$$\n"

                     "  ####%##        B$$$$$$$$&&&    $$$\n"

                     "     B=           $$$$$$ $$$$      $$$\n"

                     "                   BBB#&@%%%        $$$\n"

                     "                  BBBBBBBB%%        -..\n"

                     "                 %BBBBBBBBB        . --\n"

                     "               %BBBBBBBBBBB\n"

                     "               BBBB&%BBBBB%\n"

                     "              BBBBB% BBBBB\n"

                     "             BBBBB   BBBBB\n"

                     "             BBBB    BBBBB\n"

                     "            BBB%.    BBBB%\n"

                     "             BB%%%   BBBB%\n"

                     "              B%%%&   BB%%&\n"

                     "               %%%%     %%%\n"

                     "                %%%%     @@\n"

                     "                 %%B$    @@&\n"

                     "                  $$$$   &--\n"

                     "               B@@$$$$   h&@\n";

    }


    else if(x>25&&x<250)cout<<"sing\n";

    else if(x==25)cout<<"jump\n";

    else if(x<25&&x>-25)cout<<"rap\n";

    else cout<<"basketball\n";


    return 0;

}

H:不同角度

#include <iostream>

#include <string>

using namespace std;

int main ()

{

    /* 思维题

     * 中档题

     *

     * 题目来源:蓝桥题库

     * https://www.lanqiao.cn/problems/19949/learning/

     * */

    int t;

    string s;

    cin>>t;

    while(t--){

        cin>>s;

        if(s=="0")cout<<"1";

        else cout<<s<<"0";

        cout<<' ';


        int len=s.size();

        int i=0;

        for(;i<len;i++){

            if(s[i]!='9'){

                cout<<s[i]-'0'+1;

                break;

            }

            cout<<s[i];


        }

        if(i==len)cout<<'0';

        cout<<'\n';

    }


    return 0;

}

I:找到最小操作

#include<iostream>

using namespace std;

int main(){

    /* 进制转换   n的k进制

     * 中档题

     * 找到最小操作等价于将n转化k进制,再将k进制的每位数加起来即可得到最小操作*/

    int str[100];

    int t,n,k,i,cnt;

    cin>>t;

    while(t--){

        i=0,cnt=0;

        cin>>n>>k;

        if(k==1)cout<<n<<'\n';

        else{

            while(n){

                str[i]=n%k;

                n/=k;

                i++;

            }

            for(int j=i-1;j>=0;j--){

                cnt+=str[j];

            }

            cout<<cnt<<'\n';

        }

    }

    return 0;

}

J:买可乐

#include <iostream>

#include <algorithm>

typedef long long LL;

using namespace std;

const LL MAX=200010;

LL t,n,k;

LL arr[MAX];

int main ()

{

    /* 防AK题,因用到了数组与排序

     * 数学推理

     * 从小到大排序后每次全体减去最小的剩余次数

     *

     * 坑:

     * 1、数据量大,算法时间复杂度高会超时

     * 2、于是用了乘法,但是会爆longlong,于是在此基础上用减法

     * 3、输出需判断是否合法,不合法不输出

     *

     * 题目来源:980 Div.2

     * https://codeforces.com/contest/2024/problem/B

     *

     * */


    cin>>t;

    while(t--){

        cin>>n>>k;

        LL temp=k;

        for(LL i=0;i<n;i++){

            cin>>arr[i];

        }

        sort(arr,arr+n);

        LL ans=0;

        LL pre=0;

        for(LL i=0;i<n;i++)

        {

            LL diff = arr[i]-pre;

            if(k-(n-i)*diff <=0){

                ans += k;

                k=0;

                break;

            }

            else

            {

                ans += (n-i)*diff + 1;

                k -= (n-i)*diff;

            }

            pre=arr[i];

        }

        if(ans<temp)continue;

        cout<<ans<<'\n';

    }

    return 0;

}

///参考代码二

/*

#include<iostream>

#include<algorithm>

using namespace std;

typedef long long LL;

LL T,n,k;

const int N=200010;

LL arr[N];

int main(){

    freopen("input.in","r",stdin);

    freopen("output.out","w",stdout);

    cin>>T;

    while(T--) {

        cin >> n >> k;

        for (int i = 1; i <= n; i++)cin >> arr[i];

        sort(arr + 1, arr + n + 1);

        LL res = 0;

        for (int i = 1; i <= n; i++) {

            if (k <= (n - i+1) * (arr[i] - arr[i - 1])) {

                cout << res + k << endl;

                break;

            }

            res += (n - i+1) * (arr[i] - arr[i - 1]) + 1, k -= (n - i+1) * (arr[i] - arr[i - 1]);

        }

    }


    fclose(stdin);

    fclose(stdout);

    return 0;

}*/



为解题报告打分
暂时不评分

★★
★★★
★★★★
★★★★★
发表您的评论(若贴AC代码或发表禁止言论等违禁行为将被删除并扣除积分)

|返回 |   | 转到页头|
Copyright @ 2008-2024 (浙ICP备2022001332号), TZOJ. All Rights Reserved.
2017-2024 台州市非普软件技术有限公司,浙江省台州市君悦大厦B幢1603室