每日小题打卡
目录
幂次方
手机键盘
简单排序
校庆
性感素数
幂次方
题目描述
对任意正整数 N,计算 X^Nmod233333 的值。
输入格式
共一行,两个整数 X 和 N。
输出格式
共一行,一个整数,表示 X^Nmod233333 的值。
数据范围
1≤X,N≤10^9
输入样例:
2 5
输出样例:
32
源代码
快速幂嘛
#include <iostream>
using namespace std;
typedef long long ll;
ll fast(ll a,ll b,ll p)
{
if(b == 0)return 1 % p;
ll ans = 1;
while(b > 0)
{
if(b & 1)ans = ans * a % p;
b >>= 1;
a = a * a % p;
}
return ans;
}
int main()
{
int x,n;
cin >> x >> n;
cout << fast(x,n,233333);
return 0;
}
手机键盘
题目描述
请你计算按照手机键盘(9 键输入法)输入字母的方式,键入给定字符串(由小写字母构成)所花费的时间。
具体键入规则和花费时间如下描述:
对于同一键上的字符,例如 a,b,c 都在 “1” 键上,输入 a 只需要按一次,输入 c 需要连续按三次。
如果连续两个字符不在同一个按键上,则可直接按,如:ad 需要按两下,kz 需要按 6 下。
如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如 ac,在按了 a 之后,需要等一会儿才能按 c。
现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。
输入格式
输入包含多组测试数据。
每组数据占一行,包含一个由小写字母构成的字符串。
输出格式
对于每组输入,输出一行结果表示键入给定字符串所需要花费的时间。
数据范围
每个输入最多包含 100 组测试数据。
所有字符串的长度都不超过 100。
输入样例:
bob
www
输出样例:
7
7
源代码
刚开始没动脑子直接暴力
#include <iostream>
using namespace std;
int main()
{
string s;
while(cin >> s)
{
int ans = 0;
for(int i = 0;i < s.size();i ++ )
{
if(i > 0)
{
if((s[i] == 'a'||s[i] == 'b'||s[i] == 'c')&&(s[i - 1] >= 'a' && s[i - 1] <= 'c'))ans += 2;
if((s[i] == 'd'||s[i] == 'e'||s[i] == 'f')&&(s[i - 1] >= 'd' && s[i - 1] <= 'f'))ans += 2;
if((s[i] == 'g'||s[i] == 'h'||s[i] == 'i')&&(s[i - 1] >= 'g' && s[i - 1] <= 'i'))ans += 2;
if((s[i] == 'j'||s[i] == 'k'||s[i] == 'l')&&(s[i - 1] >= 'j' && s[i - 1] <= 'l'))ans += 2;
if((s[i] == 'm'||s[i] == 'n'||s[i] == 'o')&&(s[i - 1] >= 'm' && s[i - 1] <= 'o'))ans += 2;
if((s[i] == 't'||s[i] == 'u'||s[i] == 'v')&&(s[i - 1] >= 't' && s[i - 1] <= 'v'))ans += 2;
if((s[i] == 'p'||s[i] == 'q'||s[i] == 'r'||s[i] == 's')&&(s[i - 1] >= 'p' && s[i - 1] <= 's'))ans += 2;
if((s[i] == 'w'||s[i] == 'x'||s[i] == 'y'||s[i] == 'z')&&(s[i - 1] >= 'w' && s[i - 1] <= 'z'))ans += 2;
}
if(s[i] == 'a'||s[i] == 'd'||s[i] == 'g'||s[i] == 'j'||s[i] == 'm'||s[i] == 'p'||s[i] == 't'||s[i] == 'w')ans += 1;
else if(s[i] == 'b'||s[i] == 'e'||s[i] == 'h'||s[i] == 'k'||s[i] == 'n'||s[i] == 'q'||s[i] == 'u'||s[i] == 'x')ans += 2;
else if(s[i] == 'c'||s[i] == 'f'||s[i] == 'i'||s[i] == 'l'||s[i] == 'o'||s[i] == 'r'||s[i] == 'v'||s[i] == 'y')ans += 3;
else if(s[i] == 's'||s[i] == 'z')ans += 4;
}
cout << ans << endl;
}
return 0;
}
动了点脑子优化
#include <iostream>
using namespace std;
int a[26] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
int b[26] = {1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,6,7,7,7,8,8,8,8};
int main()
{
string s;
while(cin >> s)
{
int ans = 0;
for(int i = 0;i < s.size();i ++ )
{
if(i == 0)ans += a[s[i] - 'a'];
else
{
if(b[s[i] - 'a'] == b[s[i - 1] - 'a'])ans += 2;
ans += a[s[i] - 'a'];
}
}
cout << ans << endl;
}
return 0;
}
简单排序
题目描述
给定一个包含 n 个整数的数组,请你删除数组中的重复元素并将数组从小到大排序后输出。
输入格式
第一行包含一个整数 n。
第二行包含 n 个不超过 1000 的正整数。
输出格式
输出去重和排序完毕后的数组。
数据范围
1≤n≤1000
输入样例:
6
8 8 7 3 7 7
输出样例:
3 7 8
源代码
vector容器排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> A;
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
int num;
cin >> num;
A.push_back(num);
}
sort(A.begin(),A.end());
A.erase(unique(A.begin(),A.end()),A.end());
for(int i = 0;i < A.size();i ++ )cout << A[i] << ' ';
return 0;
}
校庆
题目描述
2019 年浙江大学将要庆祝成立 122 周年。
为了准备校庆,校友会收集了所有校友的身份证号。
现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。
输入格式
输入在第一行给出正整数 N。
随后 N 行,每行给出一位校友的身份证号(18 位由数字和大写字母 X 组成的字符串)。题目保证身份证号不重复。
随后给出前来参加校庆的所有人士的信息:
首先是一个正整数 M。
随后 M 行,每行给出一位人士的身份证号。题目保证身份证号不重复。
输出格式
首先在第一行输出参加校庆的校友的人数。
然后在第二行输出最年长的校友的身份证号 —— 注意身份证第 7−14 位给出的是 yyyymmdd
格式的生日。
如果没有校友来,则在第二行输出最年长的来宾的身份证号。题目保证这样的校友或来宾必是唯一的。
数据范围
1≤N,M≤10^5
输入样例:
5
372928196906118710
610481197806202213
440684198612150417
13072819571002001X
150702193604190912
6
530125197901260019
150702193604190912
220221196701020034
610481197806202213
440684198612150417
370205198709275042
输出样例:
3
150702193604190912
源代码
利用哈希表进行处理
A.count(s)在容器之中查找名为s的元素
A.insert(s)在容器之中插入名为s的元素
a.empty()和a.substr(idx,lenth)分别是
判断a字符串是否为空和截取字符串的下标从idx开始长度为lenth的字串
特别注意文字游戏:
记得在来访者之中没有校友的话输出来访者之中年龄最大的身份证号
在来访者之中有校友的话输出参加校庆的校友当中年龄最大的身份证号
#include <iostream>
#include <unordered_set>
#include <algorithm>
using namespace std;
unordered_set<string> A;
int ans = 0;
int main()
{
int n;
cin >> n;
while(n -- )
{
string s;
cin >> s;
A.insert(s);
}
int m;
cin >> m;
string a,b;
while(m -- )
{
string s;
cin >> s;
if(A.count(s))
{
ans ++ ;
if(a.empty() || a.substr(6,8) > s.substr(6,8))a = s;
}
if(b.empty() || b.substr(6,8) > s.substr(6,8))b = s;
}
cout << ans << endl;
if(ans)cout << a;
else cout << b;
return 0;
}
性感素数
题目描述
“性感素数”是指形如 (p,p+6) 这样的一对素数。
之所以叫这个名字,是因为拉丁语管“六”叫“sex”(即英语的“性感”)。
现给定一个整数,请你判断其是否为一个性感素数。
输入格式
输入在一行中给出一个正整数 N。
输出格式
若 N 是一个性感素数,则在一行中输出 Yes
,并在第二行输出与 N 配对的另一个性感素数(若这样的数不唯一,输出较小的那个)。
若 N 不是性感素数,则在一行中输出 No
,然后在第二行输出大于 N 的最小性感素数。
数据范围
1≤N≤10^8
输入样例1:
47
输出样例1:
Yes
41
输入样例2:
21
输出样例2:
No
23
源代码
首判N是否为性感素数
若其是则必定有解,优先输出其左边较小的解,若没有的话则输出右边较大的解
若是无解的话则开始从N往后查找最小的性感素数而不是素数
#include <iostream>
#include <cmath>
using namespace std;
bool judge(int n)
{
if(n == 0||n == 1||n < 0)return 0;
for(int i = 2;i <= sqrt(n);i ++ )
{
if(n % i == 0)return false;
}
return true;
}
bool sex(int n)
{
if(judge(n) && judge(n + 6) || judge(n) && judge(n - 6))return true;
else return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
if(sex(n))
{
cout << "Yes" << endl;
if(judge(n - 6))cout << n - 6 << endl;
else if(judge(n + 6))cout << n + 6 << endl;
}
else
{
cout << "No" << endl;
for(int i = n;;i ++ )
{
if(sex(i))
{
cout << i << endl;
break;
}
}
}
return 0;
}