天天快乐编程集训队2021暑假训练-0807-模拟题解

本次训练不算太难,相对来说比较容易,大家可以尝试把它补完

1.6964 最小的2个数

本题共有两种解法,可以直接排序,这个做法是nlogn的,题目没有卡

#include <bits/stdc++.h>
using namespace std;
struct T
{
    int id, data;
} a[100005];
int cmp(T a, T b) { return a.data < b.data; }
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i].data;
        a[i].id = i;
    }
    sort(a, a + n, cmp);
    cout << a[0].id << " " << a[1].id;
    return 0;
}

也可以直接O(n)求得,分别求下最小和次小用来更新即可

#include <bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    //默认最小索引是-1
    int min1=-1,min2=-1;
    for(int i=0;i<n;i++)
    {
        //比最小还小
        if(min1==-1||a[i]<a[min1])
        {
            //次小更新为最小
            min2=min1;
            //最小更新为当前
            min1=i;
        }
        else if(min2==-1||a[i]<a[min2])
        {
            //更新次小
            min2=i;
        }
    }
    cout<<min1<<" "<<min2<<"\n";
    return 0;
}

2.6744 条形码

按题目条件模拟即可。

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

int main()
{
    string s;
    cin>>s;
    int sum1=0;
    //步骤a
    //下标从0开始,倒数第一位即长度-1,序号2即长度-2
    for(int i=13-2;i>=0;i-=2)
    {
        sum1+=s[i]-'0';
    }
    //步骤b,*3
    sum1*=3;
    //步骤c
    for(int i=13-3;i>=0;i-=2)
    {
        sum1+=s[i]-'0';
    }
    //步骤d和e
    int ans=(sum1+9)/10*10-sum1;
    //进行校验
    if(ans==s[12]-'0')
    {
        cout<<"OK";
    }
    else
    {
        cout<<"Error";
    }
    return 0;
}

3.5125 序列猜猜猜

这个题有歧义,get到出题人意思的话一遍就过,如果得不到正确的题意估计要迷茫很久。
我们可以统计猜对的的以及全部出现的,全部出现的-猜对的就是B了

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

int main()
{
    int c = 1;
    int n;
    while (cin>>n, n)
    {
        printf("Case %d:\n", c++);
        char a[10000], b[10000];
        cin>>a;
        while (cin>>b,b[0]!='0')
        {
            int A = 0, B = 0;
            //统计A,即位置相同的
            for (int i = 0; i < n; i++)
            {
                if (a[i] == b[i])
                    A++;
            }
            //依次统计字符的出现次数,取小
            for (int i = '1'; i <= 'z'; i++)
            {
                int an = 0, bn = 0;
                //枚举序列的每个字符
                for (int j = 0; j < n; j++)
                {
                    if (a[j] == i)
                        an++;
                    if (b[j] == i)
                        bn++;
                }
                //取小
                B += min(an,bn);
            }
            printf("    (%d,%d)\n", A, B - A);
        }
    }
    return 0;
}

4.6741 动动有奖

3个规则分别考虑,可以列出以下流程
①输入总天数n
②表示天数的变量i初始化为1
③若i≤n,则转④,否则转⑦。
④输入第i天的数据(包括第i天走路步数X;,是否成功领取第i天“奖金”的标
记F;)
⑤根据当前输入的数据Ⅹ,F,统计该天领取的奖金并累加到总奖金 total中。
⑥表示天数的变量i增加1,然后转③。
⑦输出变量 total的值。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    double tot=0;
    int c=0;
    for(int i=0,x,f;i<n;i++)
    {
        cin>>x>>f;
        if(f==1)
        {
            c=c+1;
        }
        else
        {
            c=0;
            continue;
        }
        double t=0;
        if(x>=1000)
        {
            t=0.3+((x-1000)/2000)*0.1;
            if(t>3)t=3;
        }
        if(c>=4)
        {
            tot=tot+2*t;
        }
        else
        {
            tot=tot+t;
        }
    }
    printf("%.1f",tot);
    return 0;
}

5.4799 作业调度方案

这个题和C一样也是语文难题,需要读懂然后模拟他的意思,稍有理解错误就GG了

6.1360 奇数阶魔方(II)

找规律之后进行模拟

posted @ 2021-08-07 10:04  暴力都不会的蒟蒻  阅读(53)  评论(0编辑  收藏  举报