端午节模拟赛题解

快乐的端午节模拟赛结束了 在此特发一篇题解作为纪念

第一题 公寓的房间

在这里插入图片描述

思路

这个题目嘛 倒也没什么可以说的直接用两个循环把所有房间枚举一遍 最后用一个变量 s u m sum sum把房间号的和记录下来即可。

代码

#include<iostream>
using namespace std;
int n,k;
long long ans;
int main()
{
    cin>>n>>k;//输入
    //循环枚举房间 将房间号加起来
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=k;++j)
        {
            ans+=i*100+j;
        }
    }
    cout<<ans<<endl;//输出
}

第二题 旋转180

在这里插入图片描述

思路

这个题目嘛也同样挺水的 只需要把每个数字旋转180度后的所有情况运用 i f if if语句一个一个特判即可。
最后这里有一个小小的坑点 就是记得倒叙输出!

数字旋转180度前数字旋转180度后
00
11
69
88
96

代码

#include<bits/stdc++.h>
using namespace std;
char a[100005];
int len;
int main()
{
    cin>>a+1;//输入字符串
    len=strlen(a+1);//求出字符串长度
    for(int i=len;i>=1;--i)//倒叙输出
    {
    	//表格中的特判
        if(a[i]=='6')
        cout<<'9';
        else if(a[i]=='9')
        cout<<'6';
        else
        cout<<a[i];
    }
}

第三题 旅行

在这里插入图片描述

思路

这个题我没有做对 只拿了67分。
这个题的大致思路就是设定一个变量 k k k用于储存当前还剩的钱 然后将这些村子的起始位置排个序 一个一个取模拟就可以了(虽然很简单 但是我还是不知道我为啥只拿了67)

代码

下面给大家呈现 a k ak ak大佬 x u y u e t a n xuyuetan xuyuetan的代码

#include <bits/stdc++.h>
using namespace std;
struct node {
    long long a, b;
} ab[200005];
bool cmp(node x, node y) { return x.a < y.a; }//重载小于符号
long long n, k, ans;
int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> ab[i].a >> ab[i].b;//输入
    }
    sort(ab + 1, ab + n + 1, cmp);//排序
    for (int i = 1; i <= n; i++) {
        if (k < ab[i].a - ab[i - 1].a) {//如果不可以到达该点
            ans += k;//将ans加上k
            k = 0;
            break;//因为无法到达更远的点 直接跳出循环
        } else {//可以到达的话
            k -= ab[i].a - ab[i - 1].a;
            k += ab[i].b;//当前钱数的运算
            ans += ab[i].a - ab[i - 1].a;//答案加上两个点的距离
        }
    }
    cout << ans + k;//有可能到达更远的点 所以记得加上当前的钱数
}

第四题 序列

在这里插入图片描述

思路

这个题目一定注意不要按着题意纯模拟 这个题虽然没给数据范围 但是很显然模拟是 O ( O( O(n2 ) ) )的复杂度 事实证明只能骗到十分 并且会TLE
这个题目要去优化的话 我们要运用到桶的思想。我们先用一个桶来储存 a a a数组中所含有的数字的个数 再用另一个桶来储存 b b b数组下标为 c c c数组元素的个数。 用桶记录了每个数字的个数之后,这里又出现了类似于排列组合的问题 每访问一个元素时 我们就将 a n s ans ans加上这个元素在第一个桶里主线的个数*这个元素在第二个桶里主线的个数。因为这里是一个乘法原理 方案数就是这这个元素分别出现在第一个桶和第二个桶的个数的乘积。然后 每访问一次就加一次 最后直接输出 a n s ans ans

代码

#include<iostream>
using namespace std;
int n;
int a[10000005],b[10000005],c[10000005],d[10000005];
int maxx;
int ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        int x;
        cin>>x;
        a[x]++;//第一个桶
        maxx=max(maxx,x);
    }
    for(int i=1;i<=n;++i)
    {
        cin>>b[i];
    }
    for(int i=1;i<=n;++i)
    {
        cin>>c[i];
        d[b[c[i]]]++;//第二个桶
    }
    for(int i=0;i<=maxx;++i)
    {
        //cout<<a[i]<<" "<<d[i]<<endl;
        if(d[i]>=1&&a[i]>=1)
        ans+=a[i]*d[i];//加上这个元素分别出现在a桶和d桶个数的乘积
    }
    cout<<ans<<endl;//输出
}

总结

第一题和第二题都特别简单 根据题目描述该怎么做怎么做
第三题一定要细心 一定要仔细写代码 这个题非常容易出错
第四题要学会运用我们学过的桶去优化这个题目的代码。

友情链接:
AK大佬xuyuetan的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值