AcWing 2022暑期每日一题-笔记 C++

4268. 性感素数

性感素数 ”是指形如 (p,p+6)(p,p+6) 这样的一对素数。

之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。

现给定一个整数,请你判断其是否为一个性感素数。

输入格式

输入在一行中给出一个正整数 NN。

输出格式

若 NN 是一个性感素数,则在一行中输出 Yes,并在第二行输出与 NN 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。

若 NN 不是性感素数,则在一行中输出 No,然后在第二行输出大于 NN 的最小性感素数。

数据范围

1≤N≤1081≤N≤108

输入样例1:

47

输出样例1:

Yes
41

输入样例2:

21

输出样例2:

No
23

 题解:

#include<iostream>
using namespace std;

bool ss(int n)
{
        if(n<=0||n==1) return false;
    for(int i=2;i*i<=n;i++)
        if(n%i==0) return false;
    return true;
}


int main()
{
    int n;

    cin>>n;

    if(ss(n)&&(ss(n-6)||ss(n+6)))
    {
        cout<<"Yes"<<endl;
        if(ss(n-6)) cout<<n-6;
        else if(ss(n+6)) cout<<n+6;
    }
    else
    {
        cout<<"No"<<endl;
        for(int i=n+1;;i++)
            if(ss(i)&&(ss(i-6)||ss(i+6)))
            {
                cout<<i;
                break;
            }
    }
    return 0;
}

笔记:

质数的定义:

一个数,如果只有1和它本身两个因数,这样的数叫做质数,又称素数。

试除判断法:

算法描述:从上述定义可知,素数不能被1和它本身之外的数整除,所以,判断一个数x是否素数只要看它是否能被2~sqrt(x)间的数整除即可;而求N内所有素数则是循环重复上述过程。

时间复杂度O(√N)数据是10的八次方,所以就是10000(一万)


 4269. 校庆

20192019 年浙江大学将要庆祝成立 122122 周年。

为了准备校庆,校友会收集了所有校友的身份证号。

现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。

输入格式

输入在第一行给出正整数 NN。

随后 NN 行,每行给出一位校友的身份证号(1818 位由数字和大写字母 XX 组成的字符串)。题目保证身份证号不重复。

随后给出前来参加校庆的所有人士的信息:

首先是一个正整数 MM。

随后 MM 行,每行给出一位人士的身份证号。题目保证身份证号不重复。

输出格式

首先在第一行输出参加校庆的校友的人数。

然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7−147−14 位给出的是 yyyymmdd 格式的生日。

如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。

数据范围

1≤N,M≤1051≤N,M≤105

输入样例:

5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042

输出样例:

3
150702193604190912

题解:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_set>
using namespace std;


int main(){
int m,n;
cin>>m;

unordered_set<string> hash;

while(m--){
    string name;
    cin>>name;
    hash.insert(name);

}

cin>>n;
string a,b;
int co=0;
while(n--){
    string name;
    cin>>name;
    if(hash.count(name)){
        co++;
        if(a.empty() || a.substr(6,8)>name.substr(6,8)) a=name;
    }
    if(b.empty() || b.substr(6,8)>name.substr(6,8)) b=name;
}

cout<<co<<endl;
if(co)cout<<a<<endl;
else cout<<b<<endl;

return 0;
}

笔记: 

substr()函数用法:

定义:substr()是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。——摘自百科词条

在这里插入图片描述

hash.count()函数的用法:使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。


4273. 链表合并

  • 题目:

给定两个单链表 L1=a1→a2→…→an−1→anL1=a1→a2→…→an−1→an 和 L2=b1→b2→…→bm−1→bmL2=b1→b2→…→bm−1→bm。

如果 n≥2mn≥2m,你的任务是将较短的那个链表逆序,然后将之并入较长的链表,得到形如 a1→a2→bm→a3→a4→bm−1…a1→a2→bm→a3→a4→bm−1… 的结果。

例如给定两个链表分别为 6→76→7 和 1→2→3→4→51→2→3→4→5,你应该输出 1→2→7→3→4→6→51→2→7→3→4→6→5。

补充
本题中可能包含不在两个单链表中的节点,这些节点无需考虑。

输入格式

输入首先在第一行中给出两个链表 L1L1 和 L2L2 的头结点的地址,以及正整数 NN,即给定的结点总数。

一个结点的地址是一个 55 位数的非负整数(可能包含前导 00),空地址 NULL 用 −1−1 表示。

随后 NN 行,每行按以下格式给出一个结点的信息:

Address Data Next

其中 Address 是结点的地址,Data 是不超过 105105 的正整数,Next 是下一个结点的地址。

题目保证没有空链表,并且较长的链表至少是较短链表的两倍长。

输出格式

按顺序输出结果链表,每个结点占一行,格式与输入相同。

数据范围

1≤N≤1051≤N≤105

输入样例:

00100 01000 7
02233 2 34891
00100 6 00001
34891 3 10086
01000 1 02233
00033 5 -1
10086 4 00033
00001 7 -1

输出样例:

01000 1 02233
02233 2 00001
00001 7 34891
34891 3 10086
10086 4 00100
00100 6 00033
00033 5 -1
  • 题解:

#include<iostream>
#include<vector>
#include<algorithm>
#define x first
#define y second

using namespace std;

typedef pair<int int> PII;
const int N=1e5+10;
int h1,h2,n;
int v[N],ne[N];

int main(){
    
    cin>>h1>>h2>>n;
    
    
    while(n--){
        int addr,val,next;
        cin>>addr>>val>>next;
        v[addr]=val,ne[addr]=next;
    }
    
    vector<PII> a,b,c;
    
    for(int i=h1;i!=-1;i=ne[i])a.push_back({i,v[i]});
    for(int i=h2;i!=-1;i=ne[i])b.push_back({i,v[i]});
    
    if(a.size() < b.size())swap(a,b);
    
    for(int i=0;j=b.size-1;i<a.size();i+=2,j--){
        c.push_back(a[i]);
        if(i+1<a.size())c.push_back(a[i+1]);
        if(j>=0)c.push_back(b[j]);
    }
    
    for(int i=0;i<c.size();i++){
        printf("%05d %d",c[i].x,c[i].y);
        if(i+1<c.size())printf("%05d\n",c[i+1].x);
        else cout<<-1<<endl;
    }
    
return 0;
}
  • 笔记:

1.只要链表题出现在非面试题之外的地方,就用数组做

2.C++ vector 用法(#include <vector>)

标准库Vector类型

使用需要的头文件

#include <vector>

Vector:Vector 是一个类模板。不是一种数据类型。 Vector<int>是一种数据类型。

一、  定义和初始化

Vector<T> v1;       //默认构造函数v1为空

Vector<T> v2(v1);//v2是v1的一个副本

Vector<T> v3(n,i);//v3包含n个值为i的元素

Vector<T> v4(n);  //v4含有n个值为0的元素

二、  值初始化

1>     如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。

2>     如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。

3>     如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

三、Vector对象最重要的几种操作

1.    v.push_back(t)             在数组的最后添加一个值为t的数据

2.    v.size()                         当前使用数据的大小

3.    v.empty()                      判断vector是否为空

4.    v[n]                               返回v中位置为n的元素

5.    v1=v2                           把v1的元素替换为v2元素的副本

6.    v1==v2                         判断v1与v2是否相等

7.    !=、<、<=、>、>=      保持这些操作符惯有含义

先简单介绍一下,vector是一种顺序容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快,而且如果你用.at()访问的话,也可以做越界检查。动态数组

3.#include<algorithm>:algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。常用函数 操作https://blog.csdn.net/qq_28479381/article/details/53994972

4.无参宏定义#define
无参宏的宏名后不带参数。
其定义的一般形式为:
    #define 标识符 字符串
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。
在前面介绍过的符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义。
例如:
    #define M (y*y+3*y)
它的作用是指定标识符M来代替表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。

就是在编译前写的一个标志可以代替...

5.typepair

pair是将2个数据组合成一组数据,又不想因此定义结构体,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。

typedef pair<double, double> abc;//作用同下结构体 

typedef struct pair{
    double first;
    double second;
} abc;

6. 1e5

1ex就是10的x次方。

7.输出

%d是普通的输出
%5d是将数字按宽度为5,采用右对齐方式输出,若数据位数不到5位,则左边补空格
%-5d就是左对齐
%05d,和%5d差不多,只不过左边补0
%.5d从执行效果来看,和%05d一样
样例icon-default.png?t=M666https://blog.csdn.net/weixin_46028214/article/details/112854472?ops_request_misc=&request_id=&biz_id=102&utm_term=%2505d%20%25d&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-112854472.142^v32^pc_rank_34,185^v2^control&spm=1018.2226.3001.4187


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值