栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022.7.26c++集训总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022.7.26c++集训总结

今天是集训第二天,模拟赛4题,一题都没有对。

题目如下:

小W吃完了饭,想要在小区里散步!小W住的小区的房子排布非常奇怪:整个小区的房子绕成了一个环形,在顺时针方向上依次编号为1,2,···, n。小W住在第x号楼,散步时,他会绕着这个环逆时针散步。由于这些楼房都没有标记是第几栋,小W走了一会就找不到自己在第几栋楼了,只记得自己逆时针经过y栋楼(开始时自己那栋楼不算经过)。你可以帮小W算算他现在在第几号楼吗

    输入格式

输入仅一行,为三个正整数n, x, y,含义如题意所示:5 2 2

    输出格式

输出一行一个正整数,表示小W散步后位于第几号楼: 5

小W从2号楼开始逆时针经过两栋楼,相当于走了两步,到达了5号楼

我一开始是这样写的:

#include
using namespace std;
long long y,last=0;
int n,x;
int main()
{
    cin >> n >> x >> y;
    last=x-y;
    while(last<=0)
    {
        last=last+n;
    }
    cout << last;
    return 0;
 } 

但是,这个用while循环,超时了。

T2

题目如下:

输入格式

输入的第一行为一个正整数T,表示小W希望你计算T个字符串的哈希值。接下来T行,每行有一个小写字符串S和对应的模数p,表示他希望你计算字符串S在进制转换法下得到的数字模p后的值。以十进制输出。请认真阅读样例解释,以确保你所理解的进制转换法与题意是正确的。2.输出格式

输出T行T个整数,表示你所计算的哈希值。2.4样例

12.4.1

样例输入

3

zard 139

zerd 139

wib 123

2.4.2

样例输出

49

112

75

2.4.3

样例解释

将a视作0,将b视作1,以此类推,z视作25。那么,字符串zard对应的26进制数为25×263+ 0×262+ 17*261+ 3×260=439845,其对139的取模后结果为49。而字符串zerd对应的26进制数为25×263+4×262+17×261+3×260= 442549,其对139的取模后结果为112。字符串wib对应的26进制数为22×262+ 8×261+ 1×260= 15081,其对123取模后结果为75

这一题定义int的数组,但计算量大所以可以转换为long long 。

如:ans =(long long)(a * b)% p * c % p * d。这样无论a, b,c,d有多大,ans都在p之内

T3

倍数问题

3.1

题目描述

小W喜欢研究k的倍数!具体来说,小W现在手上有一个数字k,他对k这个数字非常喜爱。爱屋及乌,于是小W也想研究一下k的倍数。与小W不同的是,小E的桌子上摆着n堆硬币,第i堆硬币有ai个。小E此时正在冥思苦想,想要尝试利用这n堆硬币设计一些游戏或者问题。小W看着他的n堆硬币,想到了一个问题:有多少对硬币堆满足它们两堆硬币合在一起后,硬币的个数是k的倍数呢?小W想了很久还是不会做这个问题,但是他又不想问小E,因为会被小E嘲讽。所以他只能向你求助了。

3.2

             输入格式

输入的第一行为两个正整数n, k,含义如题目所示。

 第二行为n个正整数a1, a2,···, an,含义如题目所示。

3.3

            输出格式

输出一行一个非负整数,表示有多少对硬币堆满足其硬币数量之和为k的倍数。

3.4样例

13.4.1

样例输入

5 3

1 2 3 4 5

3.4.2

样例输出

4

3.4.3

样例解释

下以

(i, j)表示选择了第i堆和第j堆硬币拼在一起。拼出了3的倍数有:(1,2),(2,4),(4,5),(1,5

 一开始以为是dfs,卡了很久,结果不是;

其实如果这个收据偏小。这会很简单

直接暴力

     for( int i=0;i

{

         for(int j=0;j

       {

              if((a[i]+a[j])%k==0)//注意if里要用“==”

               {

                         ans++;

               }

但是你看!!!

对于所有数据,保证1≤n≤2×10^5,1≤ai≤10^9,1≤k≤10^5

不够用怎么办?用桶!

#include
using namespace std;

int n,k;
long long a[1100000],ans=0,bik[1100000],d=0,f=0;

int main()
{
    cin >> n >>k;
    for(int i=0;i     {
        cin >> a[i];
    }
    for(int i=0;i     {
        bik[a[i]%k]++;
    }
    if(k==2)
    {
        ans+=bik[1]*(bik[1]-1)/2;
    }
    else
    {
        for(int i=1;i<=(k-1)/2;i++)
        {
           ans+=(bik[i]*bik[k-i]);
        }
        if(k%2==0)
        {
            f=bik[k/2]*(bik[k/2]-1)/2;
        }
    }
    d=bik[0]*(bik[0]-1)/2;
    cout << ans+d+f;
    return 0;
}

要注意k==2和k%2==0的情况

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025442.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号