目录
1、门牌制作
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 11 到 2020编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7即需要 11 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020号门牌,总共需要多少个字符 ?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
#include <iostream>
using namespace std;
int main()
{
int n =2020;
int count =0;
int a=0;
int b=0;
for (int i=1;i<=n;i++){
b = i;
while(b>0){
a = b%10;
b/=10;
if (a==2) count+=1;
}
}
cout << count<<endl;
// 请在此输入您的代码
return 0;
}
2、顺子日期
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
#include <iostream>
using namespace std;
int month[]{
0,31,28,31,30,31,30,31,31,30,31,30,31
};
int main()
{
int ans = 0;
for (int i=0;i<2;i++)
for (int j=0;j<10;j++){
int k =j+1;
for (int l=0;l<10;l++){
int m=i*10+j;//月
int d=k*10+l;
if(m<13 && d<=month[m]&&(i==j-1||k==l-1)) ans++;
}
}
cout << ans <<endl;
return 0;
}
3、货物摆放
题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 LL、WW、HH 的货物,满足 n = L \times W \times Hn=L×W×H。
给定 nn,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4n=4 时,有以下 66 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当 n = 2021041820210418n=2021041820210418 (注意有 1616 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include <iostream>
#define ll long long
using namespace std;
const int MAXN = 1e3+10;
ll factor[MAXN];
int main()
{
ll n;
n = 2021041820210418;
int len = 0;
for (ll i=1;i*i<=n;i++){
if (n%i==0){
factor[len++] = i;
if(i!=n/i) factor[len++]=n/i;
}
}//factor 数组存放n的所有因子,一个存len个因子
ll cnt=0;
for (ll a=0;a<len;a++)
for (ll b = 0;b<len;b++)
{
if(factor[a]*factor[b]>n) continue;
for (ll c=0;c<len;c++)
{
if(factor[a]*factor[b]*factor[c]==n)
cnt++;//所取的三个因子相乘恰好等于n
}
}
cout <<cnt <<endl;
// 请在此输入您的代码
return 0;
}
其中,i*i<=n,比较重要,因为这样可以避免重复的公约数。
4、质数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……
请你计算第2019 个质数是多少?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
#include <iostream>
using namespace std;
const int maxN = 2020;
int zhishu[maxN];
int main()
{
int count = 1;
int i = 1;
while(count<=2019){
int c = 0;
for (int j=1;j<=i;j++){
if(i%j==0)
c++;
if(c==2&&j==i)
zhishu[count++]=i;
}
i++;
}
cout << zhishu[2019]<<endl;
return 0;
}
5、数的分解
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包含数字 2和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18和1001+1000+18 被视为同一种。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
#include <iostream>
using namespace std;
bool zhi(int i){
while(i>0){
if (i%10==2||i%10==4) return false;
i /=10;
}
return true;
}
int main()
{
int sum;
int count=0;
for(int i=1;i<2019;i++)
for(int j=i+1;j<2019;j++){
if(i+j>=2019) break;
int k =2019-i-j;
if(k<=j) break;
if(zhi(i)&&zhi(j)&&zhi(k)) count++;
}
cout<<count<<endl;
// 请在此输入您的代码
return 0;
}
按照i<j<k得顺序进行筛选。降低复杂度,最后k是等于n-j-i
6、赢球票
题目描述
某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。
主持人拿出 N张卡片(上面写着 1 \cdots N1⋯N 的数字),打乱顺序,排成一个圆圈。
你可以从任意一张卡片开始顺时针数数: 1,2,3 \cdots⋯
如果数到的数字刚好和卡片上的数字相同,则把该卡片收入囊中,从下一个卡片重新数数。
直到再无法收获任何卡片,游戏结束。囊中卡片数字的和就是赢得球票的张数。
比如:
卡片排列是:1 2 3
我们从 1 号卡开始数,就把 1 号卡拿走。再从 2 号卡开始,但数的数字无法与卡片对上,很快数字越来越大,不可能再拿走卡片了。因此这次我们只赢得了 1 张球票。
还不算太坏!如果我们开始就傻傻地从 2 或 3 号卡片数起,那就一张卡片都拿不到了。
如果运气好,卡片排列是 2 1 3,那我们可以顺利拿到所有的卡片!
本题的目标:已知顺时针卡片序列,随便你从哪里开始数,求最多能赢多少张球票(就是收入囊中的卡片数字之和)
输入描述
第一行一个整数 NN (N \leq 100N≤100),表示卡片数目。
第二行 NN 个整数,表示顺时针排列的卡片。
输出描述
输出一行,一个整数,表示最好情况下能赢得多少张球票。
输入输出样例
示例
输入
3
1 2 3
输出
1
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e2+10;
int n;
int a[N], backup[N];
int get(int k){
int sum = 0,cnt = 1;
memcpy(a,backup,sizeof a);
// for (int i =0;i<n;++i)
// a[i] = backup[i];
while(true){
while(a[k]==0) k = (k+1)%n;
if(a[k] ==cnt ){
sum+=a[k];
a[k]=0;
cnt = 1;
}
else cnt ++;
k=(k+1)%n;
if(*max_element(a,a+n)==0)
return sum;
if(cnt >n)
return sum;
}
return -1;
}
int main()
{
cin >> n;
for (int i = 0;i <n;++i)
cin >>backup[i];
int res=0;
for (int i = 0;i<n;++i) // 遍历所有位置,最后的结果
res = max(res,get(i));
cout <<res <<endl;
// 请在此输入您的代码
return 0;
}