目录
性感素数 (来自acwing)
“性感素数 ”是指形如 (p,p+6) 这样的一对素数。
之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。
现给定一个整数,请你判断其是否为一个性感素数。
输入格式
输入在一行中给出一个正整数 N。
输出格式
若 N 是一个性感素数,则在一行中输出 Yes
,并在第二行输出与 NN 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。
若 N 不是性感素数,则在一行中输出 No
,然后在第二行输出大于 N 的最小性感素数。
数据范围
1≤N≤1e8
输入样例1:
47
输出样例1:
Yes
41
输入样例2:
21
输出样例2:
No
23
代码
需要代码解析评论区扣1
#include<iostream>
using namespace std;
bool number(int n){ //判断一个数是否为素数
if(n<=1) return false;
for(int i=2;i<=n/i;i++){ //i<=n/i这样写的原因是:i为int型,避免i*i超出int范围
if(n%i==0) return false;
}
return true;
}
int main(){
int n;
cin>>n;
if(number(n)&&number(n-6)){
cout<<"Yes"<<endl;
cout<<n-6<<endl;
}else if(number(n)&&number(n+6)){
cout<<"Yes"<<endl;
cout<<n+6<<endl;
}else{
for(int i=n+2;;i++){
if(number(i)&&(number(i-6)||number(i+6))){
cout<<"No"<<endl;
cout<<i<<endl;
break;
}
}
}
return 0;
}
校庆 (来自acwing)
2019 年浙江大学将要庆祝成立 122 周年。
为了准备校庆,校友会收集了所有校友的身份证号。
现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。
输入格式
输入在第一行给出正整数 N。
随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母 X 组成的字符串)。题目保证身份证号不重复。
随后给出前来参加校庆的所有人士的信息:
首先是一个正整数 M。
随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。
输出格式
首先在第一行输出参加校庆的校友的人数。
然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7−14 位给出的是 yyyymmdd
格式的生日。
如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。
数据范围
1≤N,M≤1e5
输入样例:
5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042
输出样例:
3
150702193604190912
代码
需要代码解析评论区扣1
//因为1<=N,M<=1e5 所以单纯的暴力匹配参加的人中有多少是校友,时间上会超限,这里可以用
//二分查找,代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
string a[N],b[N];
int cmp(string i,string j){
if(i.size()!=j.size()) return i.size()>j.size();
else{
for(int p=6;p<14;p++){
if(i[p]!=j[p]) return i[p]<j[p];
}
}
}
int main(){
int n,m,ans=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>m;
for(int i=0;i<m;i++){
cin>>b[i];
}
sort(a,a+n);
sort(b,b+m);
for(int i=0;i<n;i++){
//二分查找
int l=0,r=m-1,f=1;
int mid=l+r>>1;
while(l<=r){
if(a[i]<b[mid]) r=mid-1;
else if(a[i]>b[mid]) l=mid+1;
else {
ans++;//ans表示参加的校友数
f=0;
break;
}
mid=l+r>>1;
}
if(f) a[i]="";//将没有参加校友的设为空
}
cout<<ans<<endl;//输出参加校友的人数
if(ans){//如果ans大于0,则存在年龄最长的校友,否则在参加的人中寻找年龄最长的人
sort(a,a+n,cmp);//按照cmp进行排序
cout<<a[0]<<endl;
}else{
sort(b,b+m,cmp);//按照cmp进行排序
cout<<b[0]<<endl;
}
return 0;
}