A. 结果填空:钟表
一天蒜头君 22:28:45 开始睡觉,06:24:26 醒来之后,蒜头君在想,今天我睡了多久?
请你告诉蒜头君睡了"h:m:s"
,如果 h,m,sh,m,sh,m,s 不足两位时,前面补 000。
例如:蒜头君睡了 101010 小时 111 分钟 000 秒,那么请输出"10:01:00"
(不包含引号)。
解析:直接拿笔计算一下就行,不用写代码。
#include <stdio.h>
int main() {
printf("%s\n", "07:55:41");
return 0;
}
B. 结果填空:青蛙爬井
有一口深度为 highhigh 米的水井,井底有一只青蛙,它每天白天能够沿井壁向上爬 upup 米,夜里则顺井壁向下滑 downdown 米。
若青蛙从某个早晨开始向外爬,当 high = 60405high=60405,up = 105up=105,dow = 35dow=35,计算青蛙多少天能够爬出井口?
注意:不能简单地认为每天上升的高度等于白天向上爬的距离减去夜间下滑的距离,因为若白天能爬出井口,则不必等到晚上。
解析:只需要加一个特判即可;
答案:863
#include<bits/stdc++.h>
using namespace std;
int main()
{
int h=60405,s=0,num=0;
while(s<h){
s+=105;num+=1;
if(s>=h) break;
s-=35;
}
cout<<num<<endl;
return 0;
}
C. 结果填空:倍数
一天蒜头君在想,[l,r][l,r][l,r] 之间有多少个数字是 ddd 的倍数呢?
但是区间 [l,r][l,r][l,r] 是 ddd 的倍数的数字太多,于是聪明的蒜头君便找到了你。
当 l=1032l = 1032l=1032,r=12302135942453r = 12302135942453r=12302135942453,d=234d = 234d=234,ddd 的倍数有多少个呢?
解析:要用long long 行的数据
#include<iostream>
using namespace std;
int main() {
long long l=1032,r=12302135942453,d=234;
cout<<r/d-(l-1)/d<<endl;
return 0;
}
E. 代码填空:LIS
LIS 是最长上升子序列。什么是最长上升子序列? 就是给你一个序列,请你在其中求出一段最长严格上升的部分,它不一定要连续。
就像这样:222, 333, 444, 777 和 222, 333, 444, 666 就是序列 222 555 333 444 111 777 666 的两个上升子序列,最长的长度是 444。
#include <stdio.h>
#include <stdlib.h>
#define N 100009
int f[N], a[N];
int n;
int find(int l, int r, int x) {
while (l < r) {
int mid = (l + r) / 2;
if (f[mid] < x) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
int lis() {
int len = 0;
for (int i = 0; i < n; i++) {
int k=find(0,len,a[i]);
f[k] = a[i];
if (k == len) {
len++;
}
}
return len;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
}
printf("%d\n", lis());
return 0;
}
F. 程序设计:找质数
一天蒜头君猜想,是不是所有的偶数(除了 222),都可以用两个质数相加得到呢?于是聪明的蒜头君就找你来验证了。
输入格式
第一行输入一个整数 ttt 表示测试组数。
接下来 ttt 行,每行一个整数 nnn。
输出格式
输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。
数据范围
对于 30%30\%30% 的数据 1≤t≤1031 \le t \le 10^31≤t≤103。
对于 60%60\%60% 的数据 1≤t≤1051 \le t \le 10^51≤t≤105。
对于 100%100\%100% 的数据 1≤t≤106,4≤n≤1061 \le t \le 10^6, 4 \le n \le 10^61≤t≤106,4≤n≤106,nnn 为偶数。
样例输入复制
3
4
8
20
样例输出复制
2 2
3 5
3 17
解析:不能用原来的这种来判断素数,会超时的,要用素数打表
bool is_prime(int x){
for(int i=2; i*i<=x; i++){
if(x%i==0) return false;
}
return true;
}
#include<stdio.h>
int N=1e6+5;
int p[1000000+5];
int main()
{
int t;
scanf("%d",&t);
p[1]=1;//素数打表,p[i]=0是素数,p[i]=1不是素数
for(int i=2;i*i<1e6+5;i++){
if(!p[i]){
for(int j=i*i;j<=1e6+5;j+=i)
p[j]=1;
}
}
while(t--){
int n;
scanf("%d",&n);
for(int i=2;;i++){
if(!p[i]&&!p[n-i]){
printf("%d %d\n",i,n-i);
break;
}
}
}
return 0;
}
G. 程序设计:后缀字符串
一天蒜头君得到 nnn 个字符串 sis_isi,每个字符串的长度都不超过 101010。
蒜头君在想,在这 nnn 个字符串中,以 sis_isi 为后缀的字符串有多少个呢?
输入格式
第一行输入一个整数 nnn。
接下来 nnn 行,每行输入一个字符串 sis_isi。
输出格式
输出 nnn 个整数,第 iii 个整数表示以 sis_isi 为后缀的字符串的个数。
数据范围
对于 50%50\%50% 的数据,1≤n≤1031 \le n \le 10^31≤n≤103。
对于 100%100\%100% 的数据,1≤n≤1051 \le n \le 10^51≤n≤105。
所有的字符串仅由小写字母组成。
样例输入复制
3
ba
a
aba
样例输出复制
2
3
1
解析:这里用了一个函数substr(),主要功能是复制子字符串,要求从指定位置开始,一直到结束。
用mp[]记录每个字符串出现的数目,之后打印即可。
例如:
mp[ba]
mp[a]
mp[a]
mp[aba]
mp[ba]
mp[a]
总的来说,mp[ba]记录了2次,mp[a]记录了3次,mp[aba]记录了1次,故结果为 2 3 1
#include<iostream>
#include<map>
using namespace std;
string a[100000+10];
int main()
{
int n;
map<string,int> mp;
cin>>n;
for(int i=0;i<n;i++){//接收字符串
cin>>a[i];
for(int j=0;j<a[i].size();j++){
mp[a[i].substr(j)]++;//依次记录每一个字符串从j开
//始到结束大字符数目
}
}
for(int i=0;i<n;i++)
cout<<mp[a[i]]<<endl;
return 0;
}