首页 > 其他分享 >2024码蹄杯职高省赛第三场初赛全题解

2024码蹄杯职高省赛第三场初赛全题解

时间:2024-07-08 22:57:44浏览次数:22  
标签:typedef int 题解 cin long 初赛 freopen 职高 define

其实吧对于码蹄杯省赛的话,第三场是一千五百多人,百分之25的获奖率,然后前四百名左右就可以获奖,根据排行来看大概是六题左右,其中大概就四题要点脑子,其余的基本上属于语法题,也就是13题中如果语法没问题的话,九题是很轻松的,因为都是青铜白银题,语法没问题的话就OK的,然后就是一个P序列,一个打工人,一个搜索题和一个纯恶心的模拟题(骂骂咧咧)有点麻烦,最后也是C了12题,模拟题没写,烦的让人头痛,后面也是补题了,然后下面是所有题目的题解。


 第一题:神秘仪式

其实就是比大小没那么多花里胡哨,三个数字比大小,第一个和第二个的和大于第三个就输出yes否则输出no。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  int a,b,c;
  cin>>a>>b>>c;
  if(a+b>c){
    cout<<"yes";
  }else{
    cout<<"no";
  }
  return 0;
}

第二题:小码哥的式子

这题的话其实就是若干组三个数,对于每组三个数输出a*b%c的值就行,不过要注意的一点是数据范围是1e5,最好是开long long稳妥点。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  long long a,b,c;
  while(cin>>a>>b>>c){
    cout<<(long long)a*b%c<<endl;
  }
  return 0;
}

第三题:都市路径

一个有向图,到所有的地方的最短路,最短路问题用BFS解决,注意的是到不了的地方输出-1即可。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=105;
int n;
vector<vector<int>>ans(N,vector<int>(N,0));
void bfs(int t){
    queue<int> q;
    q.push(t);
    vector<int>cnt(N);
    for(int i=1;i<=n;i++){
        cnt[i]=-1;
    }
        cnt[t]=0;
        while(!q.empty()){
            int p=q.front();
            q.pop();
            for(int j=1;j<=n;j++){
                if(ans[p][j]==0||cnt[j]!=-1){
                    continue;
                }else{
                    cnt[j]=cnt[p]+1;
                    q.push(j);
                }
            }
        }
    for(int i=1;i<=n;i++){
        cout<<i<<" "<<((cnt[i]==-1)?(-1):(cnt[i]))<<endl;;
    }

}
int main()
{
  fast
  //simeple
  cin>>n;
  int u,k,v;
  for(int i=1;i<=n;i++){
    cin>>u>>k;
    while(k--){
        cin>>v;
        ans[u][v]=1;
    }
  }
  bfs(1);
  return 0;
}

第四题:奇怪的数

一个循环从1到n,同时把每个数的每位拆开,加起来为10就是符合条件的,记录总数即可。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
bool go(int n){
    int cnt=0;
    while(n){
        cnt=cnt+n%10;
        n=n/10;
    }
    return ((cnt==10)?true:false);
}
int main()
{
  fast
  //simeple
  int n;
  cin>>n;
  int sum=0;
  for(int i=1;i<=n;i++){
    if(go(i)){
        sum++;
    }
  }
  cout<<sum;
  return 0;
}

第五题:打工人

这题当时其实卡了我挺久的,当时是公式写的,但是wa了,当时没找到bug,然后换了方法写,后面才发现是溢出了(当时也没想到这题是最难的),这题的话就是说第一天可以工作1个任务,然后第二天开始后续两天可以工作2个任务(也就是1,2,2),第四天开始后面连续三天工作3个任务,此时也就是(1,2,2,3,3,3)以此类推,然后会问你从某天开始到某天,一共工作了多少任务。

下面详讲一波。

  1. 第一步:找到每天数属于哪个阶段

    找到满足\frac{k*(k+1)}{2}\geqslant day的最小k值,可以直接暴力过去逐步累加得到。
     
  2. 第二步:计算每个阶段内的任务总数

    对于每个阶段,从起点天数到终点天数,每天完成的任务数是固定的。
     
  3. 第三步:累加 [L, R] 范围内的任务总数

    从 L 到 R,分别计算经过的每个阶段完成的任务数并累加。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

// 找到给定天数 day 属于哪个阶段
int find_day(int day) {
    int s = 1;
    int days_sum = 1;
    while (days_sum < day) {
        s++;
        days_sum += s;
    }
    return s;
}

// 计算从 start 到 end 的任务总数,假设都在同一个阶段
long long sum_day(int start, int end, int day) {
    return (end - start + 1) * day;
}

// 计算区间 [L, R] 内完成的任务总数
long long sum(int L, int R) {
    long long t = 0;
    int k = L;

    while (k <= R) {
        int s = find_day(k); // 当前天数属于哪个阶段
        int mid = s * (s - 1) / 2 + 1;
        int mid2 = s * (s + 1) / 2;

        // 计算当前阶段的可计算区间
        int end = min(mid2, R);
        t += sum_day(k, end, s);
        k = end + 1;
    }

    return t;
}

int main()
{
  fast
  //simeple
  int q;
    cin >> q;

    vector<pair<int, int>> ans(q);
    for (int i = 0; i < q; ++i) {
        int L, R;
        cin >> L >> R;
        ans[i] = {L, R};
    }

    for (const auto& i : ans) {
        int L = i.first;
        int R = i.second;
        cout << sum(L, R) << endl;
    }
  return 0;
}

第六题:简单的进制转换

输入是给你一个25位的二进制数字,用字符串类型读入就好,然后将其转换成10进制,用string类型进行储存,然后从后面开始推,用一个cnt记录,每次得到的就是(str[i]-'0')*pow(2,k++)然后加起来输出即可。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  string str;
  cin>>str;
  int k=0;
  int cnt=0;
  for(int i=str.size()-1;i>=0;i--){
    cnt=cnt+(str[i]-'0')*pow(2,k++);
  }
  cout<<cnt;
  return 0;
}

第七题:时间转换

这题的意思是给一个n(秒数),然后输出这个秒数转换成几小时几分钟几秒的类型(00:00:00),然后输出即可,也就是对3600除得到小时然后再对于n取模得到剩余的时间,然后对于60除一次之后得到分钟再取模之后,输出即可。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  int n;
  cin>>n;
  cout<<n/3600<<":"<<n%3600/60<<":"<<n%3600%60;
  return 0;
}

第八题:P序列

这题的话可能是算最难的,因为我个人感觉很难想到,首先要了解非严格递增,非严格递减以及先非严格递增再非严格递减是个什么情况。

  1. 非严格递增(比如 1, 2, 2, 3)。
  2. 非严格递减(比如 3, 2, 2, 1)。
  3. 先非严格递增再非严格递减(比如 1, 2, 2, 3, 2, 1)

后面其实会发现,其实这题就公式找规律,找到最大的数,记录每个数出现了多少次,然后设置一个总数为sum初始值为1,因为最少出现1次,然后循环一次sum*每个数出现的x+1次即可(注:不遍历最大的数,遍历到最大的数前一个),要开longlong因为相乘的话会溢出int。

        

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MOD=998244353;
ll cnt=INT_MIN;
int main()
{
  fast
  //simeple
  int n;
  cin>>n;
  vector<int>ans(1e7+5);
  for(int i=0;i<n;i++){
    ll x;
    cin>>x;
    ans[x]++;
    cnt=max(x,cnt);
  }
  ll sum=1;
  for(int i=0;i<cnt;i++){
    if(ans[i]){
        sum=sum*(ans[i]+1)%MOD;
    }
  }
  cout<<sum;
  return 0;
}

第九题:迷宫的秘密

这题的话题目很差,但其实就是唬人的,题意就是说一串数字,不会出现在开始和结尾同时满足他比他左边的数和右边的数大,输出即可,那么一个数组装到数字,然后从1开始遍历到n-1去判断即可。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  int n;
  cin>>n;
  vector<int>ans(n);
  for(int i=0;i<n;i++){
    cin>>ans[i];
  }
  for(int i=1;i<n-1;i++){
    if(ans[i]>ans[i-1]&&ans[i]>ans[i+1]){
        cout<<ans[i]<<endl;
    }
  }
  return 0;
}

第十题:灵异空间

这题就是,给一个n大小的数组,m次操作,每次两个数x,y,反转从x开到到y的数的位置即可,每次遍历一遍就行,从x遍历到y,swap交换,如果说x大于y就得结束。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  int n,m;
  cin>>n>>m;
  vector<int>ans(n);
  for(int i=0;i<n;i++){
    cin>>ans[i];
  }
  while(m--){
    int x,y;
    cin>>x>>y;
    for(int i=x-1,j=y-1;i<j;i++,j--){
        swap(ans[i],ans[j]);
    }
  }
  for(int i=0;i<n;i++){
    cout<<ans[i]<<" ";
  }
  return 0;
}

第十一题:寻找质因子

这题的话其实是不难的,主要是要知道质因子的概念。

质因子:质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。 除了1以外,两个没有其他共同质因子的正整数称为互质。 因为1没有质因子,1与任何正整数(包括1本身)都是互质。 正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。

知道了就很好写了。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  int n;  
    cin>>n;
    for(int i=2;i<=n;i++){  
        while(n!=i){     //若i=n,则质因数就是n本身  
            if(n%i==0)  //若i是质因数,则打印出i的值,并用商给n赋新值  
            {  
                cout<<i<<endl;//符合就输出
                n=n/i;  
            }  
            else break;//若不能被i整除,则算下一个i 
        }  
    }  
    cout<<n<<endl;   //这里是打印最后一个质因数,也就是等于i时的那个
  return 0;
}

第十二题:多项式输入

这题是让我感觉最恶心的,难度不高一个循环然后if判断即可,但是太麻烦了,纯模拟浪费时间的题,所以当时没写,这题的话注意的情况比较多,符号问题以及一些系数或者指数=0的时候即可。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

string slove(int n, vector<int>& ans) {
    stringstream ss;
    bool go = true; // 用于判断是否是第一个输出的项

    for (int i = 0; i <= n; ++i) {
        int q = ans[i];
        int p = n - i;

        if (q != 0) {
            if (go) {
                // 处理第一个项的符号
                if (q < 0) {
                    ss << "-";
                }
                go = false;
            } else {
                // 处理非第一个项的符号
                if (q > 0) {
                    ss << "+";
                } else {
                    ss << "-";
                }
            }

            // 处理系数的绝对值
            if (abs(q) != 1 || p == 0) {
                ss << abs(q);
            }

            // 处理指数部分
            if (p > 0) {
                ss << "x";
                if (p > 1) {
                    ss << "^" << p;
                }
            }
        }
    }

    return ss.str();
}

int main()
{
  fast
  //simeple
  int n;
    cin >> n;
    vector<int> ans(n + 1);
    for (int i = 0; i <= n; ++i) {
        cin >> ans[i];
    }
    string count = slove(n, ans);
    cout << count << endl;
  return 0;
}

第十三题:出去玩

这题的话其实就是四个数,第一个和第三个取个最小值,第二个和第四个取个最小值,然后两个最小值相加输出即可,这个的话开longlong是最好,因为两个1e9相加保守点开long long。

#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main()
{
  fast
  //simeple
  int a,b,c,d;
  cin>>a>>b>>c>>d;
  cout<<(long long)(min(a,c)+min(b,d));
  return 0;
}

这场下来的话难度排行应该是第八题p序列,然后是第五题打工人,接着是第三题都市路径最后是第十二题多项式(骂骂咧咧),个人任务除了这四题其他的题目应该是如果语法没问题都ok的。

标签:typedef,int,题解,cin,long,初赛,freopen,职高,define
From: https://blog.csdn.net/m0_73147661/article/details/140237785

相关文章

  • 题解(2024.7.8贪心)
    1.Teleporters(HardVersion)题意:有n+2个位置:0~n+1,给定n个数\(a_1\)~\(a_n\),有以下操作:向左/右移动一格,代价为1。传送回0位置或者n+1位置,记你当前的位置为i,则代价为\(a_i\)。每个位置只能发动一次传送。求最大传送次数思路:因为每次传送都会回到0/n+1号点,所以,到......
  • 基础算法训练题单之排序(从入门到入土)——题解
    A.P1177【模板】排序三种方法:快速排序,归并排序,STL库的sort函数。法一、三:https://www.cnblogs.com/expect-999/p/17594345.html法二:https://www.cnblogs.com/expect-999/p/17599008.htmlB.P1923【深基9.例4】求第k小的数模板题目,直接对数组进行升序排序,如果数组从......
  • Codeforces Round 953(Div.2) 题解(A-E)
    CodeforcesRound953(Div.2)题解(A-E)A题意Alice有n本书,第一本书有\(a_1\)页,序号为1,第二本书有\(a_2\)页,序号为2,……,第n本书有\(a_n\)页,序号为n。Alice将把所有书分成两堆,并阅读每一堆中序号最大的一本书。Alice喜欢读书,请你告诉她,她最多可以读多少页的书。Solution第......
  • 题解:洛谷 P1890 gcd区间
    题解:洛谷P1890gcd区间标签:线段树,st表,分块,dp题意给定数列\(a\),有\(m\)次询问求区间\([l,r]\)的最大公约数。思路这道题有多种写法,如标签所示。线段树线段树可以维护具有结合性的操作,很明显\(\gcd\)满足。这道题线段树跑的慢是因为无修改操作,自然没有其他\(O(1)......
  • 题解:洛谷 P2678 [NOIP2015 提高组] 跳石头
    题解:洛谷P2678[NOIP2015提高组]跳石头标签:二分,贪心题意给定一个数列,\(a_0=0,a_{N+1}=L\),从其中删除不超过\(M\)个数,使得\(a_i-a_{i-1}\)的最小值最大。思路从最小值最大不难想到二分答案。统计\(a_i-a_j<mid\)的数量\(k\),如果不满足的话说明不删,\(j\getsi\)。......
  • VSCode中 npm install 安装依赖包太慢了,一直加载不出来问题解决
    1.问题描述采用VSCode打开别人传过来的项目时,需要先加载依赖包,一般是通过终端来加载:终端中输入npminstall. 但是采用npminstall安装依赖包出现问题,一直加载不完,卡到某一地方,如图: 2.尝试解决2.1采用淘宝镜像,依旧慢,最后证书过期2.2采用pnpminstall(做了一部分)npmins......
  • 题解:洛谷 P1843 奶牛晒衣服
    题解:洛谷P1843奶牛晒衣服标签:二分,贪心题意给定一个数列,每秒可以将所有数减\(a\),也可以选择一个数减\(b\),二者可同时进行,求让所有数小于等于\(0\)的最小秒数。思路要求最小的秒数,也就是刚好所有数字小于等于\(0\),且尽量大。这个秒数具有单调性,考虑二分答案。二分的......
  • CodeForces CF1980C Sofia and the Lost Operations 题解 但是最后TLE 仅供思路参考
    CodeForcesCF1980CSofiaandtheLostOperations题解嗨嗨,又来了啊,蒟蒻再来一篇题解SofiaandtheLostOperations题面翻译索菲亚有一个包含$n$个整数的数组$a[1],a[2],…,a[n]$。有一天她对这个数组感到厌倦,于是决定顺序地对其应用$m$个修改操作。每个修改操作由一......
  • 洛谷p1449后缀表达式题解
    #include<stdio.h>#include<stdlib.h>#defineMAXSIZE100typedeflongElemType;typedefstruct{ ElemType*base; ElemType*top; intStackSize;}sqStack;voidInitStack(sqStack*s){ s->base=(ElemType*)malloc (MAXSIZE*sizeof(ElemTyp......
  • 24暑期第三次训练C组题解
    目录A津津的储蓄计划auto遍历:B校门外的树memset()C杨辉三角DSpecialCharacters位运算&三目运算符EStrangeSplittingFStickogonGCardExchange构造结构体和重载运算符HLeastProductI选数JPeter的烟A津津的储蓄计划模拟题,按题意模拟即可.voidfunc(){ intjin......