首页 > 其他分享 >2023GPLT选拔题解

2023GPLT选拔题解

时间:2023-04-04 18:33:30浏览次数:57  
标签:小明 ... int 题解 2023GPLT 选拔 long ll TA

看到没有题解我就给大家浅浅的写一篇吧,如果有错误,希望大家可以帮我指出来哦,创作不易,如果大家给个关注,点个赞就更好了

 

 

1:

著名开源操作系统Linux的核心创始人Linus有一句经典名言:”Talk is cheap. Show me the code.“
说出这句话时是2000年8月25日,那天有人在Linus的Linux论坛上留言讨论关于线程优化的问题,有个用户提出了一个他自认为非常高效的方案。但是Linus不认同,并且为他是在打嘴炮,于是说出了这句话反击那位用户。
这句话受到了大多数程序员的认可,于是流传至今,成为程序员抨击键盘侠的武器。
把这句话翻译过来大概是:”代码胜于雄辩。“,当然也有人会翻译成:”废话少说,放码过来。“,怎么翻译都可以,只要能让大家都看懂。
当然……这个题目并不是要你把这句话翻译,或是让你回答出关于Linux线程优化的问题。
现在只需要你将”Talk is cheap. Show me the code.“中的标点符号、空格都去掉,并且把所有字母都改为小写,然后在一行内输出出来。   代码:
talkischeapshowmethecode

2:
小学三年级的小明刚接触英语,这天老师正在教如何用英文单词表示数字。

而小明没有认真听课,TA只在乎每个数字需要用到多少个字母。

例如数字111到555,全部写成英文单词分别为:one、two、three、four、five,总共需要191919个字母。

数字342342342为:three hundred and forty-two,需要232323个字母。

数字115115115为:one hundred and fifteen,需要202020个字母。

小明现在已经学会从111数到100010001000了,但是TA想给你一个数字nnn,问你将111到nnn全部用英文表达总共需要个多少英文字母?

PS:只需要统计英文字母的数量,空格、连接符不计,“and”满足标准英文语法。

思路:这题写的我烦死了,呜呜呜,但是不难就是一个简单的暴力题

先贴一个十分丑陋的代码,但是好懂,大家一个都可以看懂纯暴力

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e6+10;
ll a[N];
ll b[21] = {0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6};
int  main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= 20;i ++)
        a[i] = b[i];
    for(int i = 21;i < 30;i ++)
    {
        a[i] = 6 + b[i%10];
    }
    a[30] = 6;
    for(int i = 31;i < 40;i ++)
    {
        a[i] = 6 + b[i%10];
    }
    a[40] = 5;
    for(int i = 41;i < 50;i ++)
    {
        a[i] = 5 + b[i%10];
    }
    a[50] = 5;
    a[60] = 5;
    for(int i = 51;i < 60;i ++)
    {
        a[i] = 5 + b[i%10];
    }for(int i = 61;i < 70;i ++)
    {
        a[i] = 5 + b[i%10];
    }
    a[70] = 7;
    for(int i = 71;i < 80;i ++)
    {
        a[i] = 7 + b[i%10];
    }
    a[80] = 6;
    for(int i = 81;i < 90;i ++)
    {
        a[i] = 6 + b[i%10];
    }
    a[90] = 6;
    for(int i = 91;i < 100;i ++)
    {
        a[i] = 6 + b[i%10];
    }
    a[100] = 10;
    for(int i = 101;i < 200;i ++)
    {
        a[i] = 13 + a[i%100];
    }
    a[200] = 10;
    for(int i = 201;i < 300;i ++)
    {
        a[i] = 13 + a[i%100];
    }
    a[300] = 12;
    for(int i = 301;i < 400;i ++)
    {
        a[i] = 15 + a[i%100];
    }
    a[400] = 11;
    for(int i = 401;i < 500;i ++)
    {
        a[i] = 14 + a[i%100];
    }
    a[500] = 11;
    for(int i = 501;i < 600;i ++)
    {
        a[i] = 14 + a[i%100];
    }
    a[600] = 10;
    for(int i = 601;i < 700;i ++)
    {
        a[i] = 13 + a[i%100];
    }
    a[700] = 12;
    for(int i = 701;i < 800;i ++)
    {
        a[i] = 15 + a[i%100];
    }
    a[800] = 12;
    for(int i = 801;i < 900;i ++)
    {
        a[i] = 15 + a[i%100];
    }
    a[900] = 11;
    for(int i = 901;i < 1000;i ++)
    {
        a[i] = 14 + a[i%100];
    }
    a[1000] = 11;
    ll ans = 0;
    //cout << a[115] << '\n';
    for(int i = 1;i <= n;i ++)
        ans += a[i];
    printf("%lld\n",ans);
}

 

再贴一个好看一点的,21级同学没有写出来的可以看看这个

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[] = {0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8};
int b[] = {0,0,6,6,5,5,5,7,6,6};
int n,s;
signed main()
{
    cin>>n;
    
    for(int i=1;i<=n;i++)
    {
        if(i>=1&&i<20)
            s+=a[i];
        else if(i>=20&&i<100)
        {
            s+=b[i/10]+a[i%10];
        }
        else if(i>=100&&i<1000)
        {
            if(i%100==0)
                s+=a[i/100]+7;
            else if(i%100>=1&&i%100<20)
                s+=a[i/100]+10+a[i%100];
            else if(i%100>=20&&i%100<100)
                s+=a[i/100]+10+a[i%10]+b[i/10%10];
        }
        else s+=11;
    }
    
    cout << s << '\n';
}

3:
小明现在上六年级了,数学老师很喜欢聪明的TA,想邀请小明参加数学奥林匹克竞赛。

但小明从小就有很强的欲望参加信息学奥林匹克竞赛,TA的数学老师觉得编程也能解决一些数学难题,于是给小明出了一道六年级的奥数题:

给定nnn个数字a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1​,a2​,a3​,...,an​求

(∑l=1n∑r=ln∑i=lrai)mod  109+7(\sum_{l=1}^{n}\sum_{r=l}^{n}\sum_{i=l}^{r} a_i) \mod {10}^9+7(∑l=1n​∑r=ln​∑i=lr​ai​)mod109+7

数学老师担心小明看不懂数学符号,于是给了一点提示,上述公式转换为C++语言后的代码差不多是:
int ans = 0, MOD = 1e9 + 7;
for (int l = 1; l <= n; ++l) {
    for (int r = l; r <= n; ++r) {
        for (int i = l; i <= r; ++i) {
            ans = (ans + a[i]) % MOD;
        }
    }
}
但是数学老师说这份代码不足以在111秒之内得出答案,TA希望小明能写出111秒内就得出答案的程序。

小明还不太会编程,于是TA决定来求助已经上大学的你,你可以帮TA实现程序吗?

思路:我们把题给的代码先写出来

如图

 

 

 这个时候我们可以发现他成一个阶梯,因此公式就可以推出来了 ans = a[1]*n+a[2]*(n-1)*2 + ....+a[n]*n; 代码:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 1e6 + 10;
ll a[N],b[N],c[N];
const int md = 1e9 + 7;
int main()
{
    int n;
    cin >> n;
    ll ans = 0;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        ans =(ans + a[i]*(n-(i-1))*i%md)%md;
    }
    
    cout << ans << '\n';
}

注意取模和longlong

4:

链接:https://ac.nowcoder.com/acm/contest/55146/D
来源:牛客网

小明高中毕业了,TA平时很喜欢看一些军旅节目,向往着军队的生活,也希望能到部队里磨练一下自己的意志,于是TA报名了义务参军。

小明被分配到了一个非常神秘的部队,这个部队算上小明有nnn个人,每个人都有一个编号。但是小明很快发现TA的编号居然和某一个战友一模一样,紧接着让TA更惊讶的是,部队里居然每个编号都恰好只出现两次!

如果你看不懂,可以理解为有nnn(nnn必然为偶数)个数,对于每一个aia_iai​,有且仅有一个j≠ij \neq ij​=i,使得ai=aja_i = a_jai​=aj​。

部队里这些人都是新兵蛋子,而且碰上了一个很特殊的教官,教官在新兵每天早晨训练前都要做这么一件事:

- 将nnn个人均分为两队,每队mmm(m=n2m = \frac{n}{2}m=2n​)人,从左到右一字排开,即把a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1​,a2​,a3​,...,an​随机分成x1,x2,x3,...,xmx_1,x_2,x_3,...,x_mx1​,x2​,x3​,...,xm​和y1,y2,y3,...,ymy_1,y_2,y_3,...,y_my1​,y2​,y3​,...,ym​。
- 让一部分人出列,其他人的相对位置不变,使得两队都变成完美队列。

教官对于完美队列的定义:人数必须是偶数(包括000),且从左到右每两个人的编号都恰好是一样的,形如a,a,b,b,c,c,...a,a,b,b,c,c,...a,a,b,b,c,c,...。

举个例子,2,2,3,3,8,82, 2, 3, 3, 8, 82,2,3,3,8,8就是完美队列,而2,2,3,8,82,2,3,8,82,2,3,8,8则不是。

教官每天会指派所有出列的人中编号最大的人作为今天的助教,并奖励冰水一瓶,但是教官同时又希望这个人编号尽可能的小。

教官听说小明会编程,于是想请小明帮忙设计一个程序,给定已经分好的两队人的编号和顺序,要求出最小的助教编号。

小明每天都很辛苦训练,没有多少时间再涉略编程知识,部队里也没有电脑可以用,于是TA决定求助你来实现这个程序。

思路一:二分答案,这个没有什么好说的,这里我不想写了,就贴了一个代码

代码:

#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
using namespace std;
const int N = 1e6 + 10;
int a[N],b[N],n;
vector<int> c;
bool check(int x)
{
    c.clear();
    for(int i = 1; i <= n; i ++) if(a[i] > x) c.pb(a[i]);
    int m = c.size();
    if(m & 1) return false;
    for(int i = 0; i < m; i += 2) if(c[i] != c[i+1]) return false;
    c.clear();
    for(int i = 1; i <= n; i ++) if(b[i] > x) c.pb(b[i]);
    m = c.size();
    if(m & 1) return false;
    for(int i = 0; i < m; i += 2) if(c[i] != c[i+1]) return false;
    return true;
}
signed main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    for(int i = 1; i <= n; i ++) cin >> b[i];
    int l = 0, r = N;
    while(l < r)
    {
        int mid = (l + r) / 2;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l << endl;
    return 0;
}

思路二:贪心,先把单个的提出来取最大,在把每一个数组当个比较,小的出队,取最大,要注意的是这个思路可行,但是这里数据弱,我交原数据的话不能用map和undered map,他会卡常,这个时候你只要手写一个哈希就可以了

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e6 + 10;
ll a1[N],b1[N];
unordered_map<int,int>mp1,mp2;
int main()
{
    int n;
    scanf("%d",&n);
    ll ans = 0;
    for(int i = 1;i <= n;i ++)
    {
        scanf("%lld",&a1[i]);
        mp1[a1[i]]++;
    }
    for(int j = 1;j <= n;j ++)
    {
        scanf("%lld",&b1[j]);
        mp2[b1[j]]++;
    }
    vector<int>a,b;
    for(int i = 1;i <= n;i ++)
    {
        if(mp1[a1[i]]>=2)
            a.push_back(a1[i]);
        else
        {
            if(ans < a1[i])
                ans = a1[i];
        }
        if(mp2[b1[i]]>=2)
            b.push_back(b1[i]);
    }
    int x = 0;
    int res = 0;
//     for(int i = 0;i < a.size();i ++)
//         cout << a[i] << " \n"[i == a.size()-1];
//     for(int i = 0;i < b.size();i ++)
//         cout << b[i] << " \n"[i == b.size()-1];
    for(int i = 1;i < a.size();i ++)
    {
        if(a[res] == a[i])
        {
            res = i+1;
            i ++;
        }
        else
        {
            if(a[res] > a[i])
            {
                x = max(a[i],x);
            }
            else
            {
                x = max(a[res],x);
                res = i;
            }
        }
    }
    int y = 0;
    int pos = 0;
    for(int i = 1;i < b.size();i ++)
    {
        if(b[pos] == b[i])
        {
            pos = i+1;
            i ++;
        }
        else
        {
            if(b[pos] > b[i])
            {
                y = max(b[i],y);
            }
            else
            {
                y = max(b[pos],y);
                pos = i;
            }
        }
    }
    if(x<y)
        x = y;
    if(ans<x)
        ans = x;
    printf("%lld\n",ans);
}

5:

小明所在的部队正准备来张大合照,合照的场地可以看作一个n×nn × nn×n的网格。

领导并不喜欢士兵密集地聚在一起,所以这次他打算定一个规则:

- 没有任何两个士兵可以同时出现在同一个网格上。
- 所有大小为2×22×22×2的网格上都只能恰好有两名士兵。

例如(`S`为士兵,`.`为空地)这一种排列方式是合法的:
SSS
...
SSS

而这一种是不合法的,由于右下角的2×22×22×2网格只有一名士兵:
S.S
.S.
S..

除此之外,士兵的排列方式没有任何限制。

部队人很多,多到所有网格如果都站一名士兵恰好够,但碍于规则,肯定不能让所有的士兵都进行合照。

每个网格上都有一个让照片增添色彩的美丽度,坐标为(i,j)(i,j)(i,j)的网格如果站有一名士兵的话,该网格的美丽度便为ai,ja_{i,j}ai,j​,否则为000,照片的美丽度为每个网格的美丽度之和。

领导希望让这张合照的美丽度最大,请问在满足规则的情况下最大的美丽度为多少? 思路:规律题,这里我先列几种情况大家可以看一下

 

 我们发现这多种情况都可以化为两种,就是行相隔或者列相隔,因此取最大就可以了

代码:

#include <bits/stdc++.h>

using namespace std;

#define int long long
const int N = 1e3 + 10;
int a[N][N];
signed main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= n;j ++)
            cin >> a[i][j];
    }
    
    int res = 0,pos = 0;
    for(int i = 1;i <= n;i ++)
    {
        map<int,int>mp;
        for(int j = 1;j <= n;j ++)
        {
            mp[j&1]+=a[i][j];
        }
        res += max(mp[0],mp[1]);
    }
    
    for(int i = 1;i <= n;i ++)
    {
        map<int,int>mp;
        for(int j = 1;j <= n;j ++)
        {
            mp[j&1]+=a[j][i];
        }
        pos += max(mp[0],mp[1]);
    }
    
    int ans = max(res,pos);
    
    cout << ans << '\n';
}

6:
小明的女朋友共有nnn根头发,她已经很久没剪头发了,每根头发的长度参差不齐(可能),但是长度都不超过nnn(可能为000)。

对于个人形象来说,发型的不良度越低代表形象越健康。而发型不良度的定义如下:

- 假设将头发从[1,n][1,n][1,n]编号,编号为iii的头发长度为aia_iai​。
- 同时满足i<ji<ji<j和ai>aja_i>a_jai​>aj​的所有二元组(i,j)(i,j)(i,j)的数量(即逆序对数)。

例如,有555根头发,长度分别为{3,2,3,3,0}\{3,2,3,3,0\}{3,2,3,3,0},那么发型的不良度为555,因为有555个二元组满足要求:(1,2)(1,2)(1,2),(1,5)(1,5)(1,5),(2,5)(2,5)(2,5),(3,5)(3,5)(3,5)和(4,5)(4,5)(4,5)。

为了维持自己的形象,她决定到家楼下的理发店剪头发,这家店可以将所有长度大于kkk的头发都减为kkk,而其他的头发长度不变。

小明的女朋友想知道kkk从[0,n−1][0,n-1][0,n−1]变化的时候,发型不良度分别应该是多少?

思路;这题有点诈骗啊,我开始还想直接贴个求逆序对的模板后面才发现,完全没有关系,我们只要求在每一位前有多少个大于他的数就可以了 代码:
#include <bits/stdc++.h>
#define lowbit(x) (x)&(-x)
using namespace std;
#define int long long
const int maxn = 1e6+10;
int t[maxn],n,result;

void add(int x)
{
    while(x<=maxn)
    {
        t[x]++;
        x += lowbit(x);
       // cout << x << '\n';
    }
    //cout << "ww" << '\n';
}

int query(int x)
{
    int ans=0;
    for (;x;x-=lowbit(x))
        ans+=t[x];
    return ans;
}
int a[maxn];
signed main()
{
    int temp;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        cin >> temp;
        add(temp+1);
        a[temp+1] += query(n+1) - query(temp+1);
    }
    for(int i = 0;i < n;i ++)
    {
        result += a[i];
        cout << result << '\n';
    }
    return 0;
}

到此所以题目就结束了,给我的感觉就是这么自己这么菜,要加训了,呜呜呜

大家也要一起加油呀QAQ

标签:小明,...,int,题解,2023GPLT,选拔,long,ll,TA
From: https://www.cnblogs.com/ljm-xiada/p/17287357.html

相关文章

  • 查看hbase表没有,但是新建却显示存在这个表的问题解决方案
    转:https://blog.csdn.net/leng91060404/article/details/106956315zookeeper数据存储及查看hbase信息1.zookeeper数据存储:1.1内存数据存储、磁盘数据存储.    内存数据存储:    数据模型是一棵树。包括所有节点路径,节点信息,ACL等。    DataTree:所有节点信息  ......
  • 洛谷 P3377 【模板】左偏树(可并堆)题解 左偏树模板题
    题目链接:https://www.luogu.com.cn/problem/P3377维护左偏树的同时还需要维护一个并查集。但是并查集也就一个find操作。pop的时候更新f[x]的操作很神奇。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;intn,m,op,x,y,val[m......
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法
    DAY10共2题:月月给华华出题华华给月月出题难度较大。......
  • C++奥赛一本通贪心题解
    C++奥赛一本通刷题记录(贪心)2017.11.15Bygwj1139177410书不见了,占坑待填。AnEasyProblempoj2453//贪心,将最右边第一个01改成10并将其右边的1都往右移到最低位#include<iostream>usingnamespacestd;intmain(){unsignedintn,x;while(cin>>n&&n){......
  • SEO常见问题解答:如何解决网站优化中遇到的难题和挑战
    SEO常见问题解答:如何解决网站优化中遇到的难题和挑战网站优化是提高网站在搜索引擎中排名和流量的重要手段,但是在优化过程中,往往会遇到各种难题和挑战,如何有效地解决这些问题,是每个网站运营者和SEO专家都需要掌握的技能。本文将针对一些常见的网站优化问题,给出一些解决方案和建议......
  • HDU动态规划题解目录
    ProblemA:MaxSum(HDU1003)   点击这里ProblemB:CommonSubsequence(HDU1159)    点击这里ProblemC:SuperJumping!Jumping!Jumping!(HDU1087)    点击这里ProblemD:HumbleNumbers(HDU1058)   点击这里ProblemE:MonkeyandBanana(HDU1069)    点击这里ProblemF:......
  • magento 问题解答 FQA
    1.IsthereawaybymysqltosetALLproductvisibilitytocatalog,search? 批量修改产品可见 openuptheeav_attributetableandfindtherowwhereattribute_code=visibility.Takenoteoftheattribute_id,mostlikelyitwillbe85.Alsotakenotetha......
  • Codeforces Round 862 (Div. 2) A-D题解
    比赛地址A.WeNeedtheZero题意:给出一个数组,对任意1<=i<=n,令bi=aix,问是否存在x,使得b<sub>1</sub>b2...bn=0Solution如果n为奇数,那么x一定存在,因为偶数个x异或得到的是0,直接令x=0(a<sub>1</sub>a2...an)即可如果n为偶数,那么x取任何值都不会影响结果,所以只用看a1a<sub>2</sub......
  • 2023年天梯赛选拔-部落划分
    题目链接:https://www.luogu.com.cn/problem/P4047感受:比赛时秒认为是二分,但二分的细节很多且不好处理,但我就是要二分。主要死在对并查集还不够熟悉,本题二分判断有几个部落只能通过并查集来实现,普通的模拟无法实现。思路:对答案进行二分,当算出来的联通的数目大于题目给定的,说明二......
  • 个人向口胡题解(4/3)
    ABC295F题意:十进制下,给定两个正整数\(L、R\)和一个字符串\(S\),设\(F(x)\)为\(S\)在\(x\)中一共出现多少次,求\(\sum_{x=L}^{R}F(x)\)。如\(S=22,F(122)=1,F(123)=0,F(222)=2\)思路:可以按\(S\)在\(x\)中匹配的位置分别计算贡献,匹配的位置知道了,那么合法的数个数就是这位的贡献......