第三章 枚举1

目录

1、门牌制作

2、顺子日期

3、货物摆放

4、质数

5、数的分解

6、赢球票


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;
}

猜你喜欢

转载自blog.csdn.net/lishijie258/article/details/128297881
今日推荐