试题
A:
日期统计
本题总分:
5
分
【问题描述】
小蓝现在有一个长度为
100
的数组,数组中的每个元素的值都在
0
到
9
的
范围之内。数组中的元素从左至右如下所示:
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2
7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1
0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3
现在他想要从这个数组中寻找一些满足以下条件的子序列:
1.
子序列的长度为
8
;
2.
这个子序列可以按照下标顺序组成一个
yyyymmdd
格式的日期,并且
要求这个日期是
2023
年中的某一天的日期,例如
20230902
,
20231223
。
yyyy
表示年份,
mm
表示月份,
dd
表示天数,当月份或者天数的长度只
有一位时需要一个前导零补充。
请你帮小蓝计算下按上述条件一共能找到多少个
不同
的
2023
年的日期。
对于相同的日期你只需要统计一次即可。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
8层循环,set去重
答案:235
#include<bits/stdc++.h>
using namespace std;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},t;
int a[101];
set<int> line;
void f(int n){
for(int i=n+1;i<100;i++){
for(int j=i+1;j<100;j++){
if(a[i]*10+a[j]>=1&&a[i]*10+a[j]<=12)
for(int x=j+1;x<100;x++){
for(int y=x+1;y<100;y++){
t=a[i]*10+a[j];
if(a[x]*10+a[y]>=1&&a[x]*10+a[y]<=m[t]){
line.insert(t*100+a[x]*10+a[y]);
}
}
}
}
}
}
int main(){
for(int i=0;i<100;i++)
cin>>a[i];
for(int i=0;i<100;i++){
if(a[i]==2)
for(int j=i+1;j<100;j++)
if(a[j]==0)
for(int x=j+1;x<100;x++)
if(a[x]==2)
for(int y=x+1;y<100;y++)
if(a[y]==3){
f(y);
}
} cout<<line.size();
return 0;
}
试题 B: 01 串的熵
看不懂,没做出来(更新)
用表格单变量求解
试题
C:
冶炼金属
解答:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a,b,max1=0,min1=0x3f3f3f3f;
cin>>n;
for(int i=0;i<n;i++){
cin>>a>>b;
min1=min(min1,a/b);
max1=max(max1,a%(b+1)?a/(b+1)+1:a/(b+1));
}
cout<<max1<<' '<<min1;
return 0;
}
试题
D:
飞机降落
个人思路,先按照最迟降落时刻排序,再按顺序计算前一架飞机降落时间和后一架飞机最迟降落时刻比较,冲突则跳出循环,输出‘NO’
试题
E:
接龙数列
感觉要用到dp来记录最少删除个数,不会,比赛时按输入顺序与后一个数比较,记录不同的数个数
#include<bits/stdc++.h>
using namespace std;
long long t;
int main(){
int k;
cin>>k;
string s;
char c1,c2;
cin>>s>>c1>>c2;
for(int i=0;i<s.length()-k+1;i++){
if(s[i]==c1)
for(int j=i+k-1;j<s.length();j++){
if(s[j]==c2){
t++;
}
}
}
cout<<t;
return 0;
}
试题
H:
整数删除
直播说要用到堆,但我不会,比赛时是循环记录每次删除的数字位置,再两边数字加上被删数字,再循环将被删的数字后的数字前移,数组长度减一,样例跑出来了,估计会超时
#include<bits/stdc++.h>
using namespace std;
long long t;
int main(){
int n,k;
cin>>n>>k;
int a[n],min1=0x3f3f3f3f;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<k;i++){
t=0;
min1=0x3f3f3f3f;
for(int j=0;j<n;j++){
t=a[j]<min1?j:t;
min1=min(min1,a[j]);
}
a[t-1]+=a[t];
a[t+1]+=a[t];
for(int i=t;i<n-1;i++){
a[i]=a[i+1];
}
n--;
}
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
return 0;
}
试题
I:
景区导游
图论最短路迪杰斯特拉算法或弗洛伊德算法(更新)lca算法最近公共祖先
试题
J:
砍树
并查集?