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.youkuaiyun.com/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一样
样例https://blog.youkuaiyun.com/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