JohnHHXX

 

CCF- CSP 1-202209-1如此编码

题目

 

 

样例1输入

15 32767
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Data

样例1输出

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Data

样例2输入

4 0
2 3 2 5
Data

样例2输出

0 0 0 0
Data

样例3输入

7 23333
3 5 20 10 4 3 10
Data

样例3输出

2 2 15 7 3 1 0

 

题解:

思路:

  • 按照题目要求,定义数组a[N],b[N],c[N];
  • 初始化c[0]=1,边输入a边初始化c
  • 深入理解题意:需要根据c的值去凑一个整数mc[i]的使用个数为b[i]
  • 从大到小进行选择(倒序),每次尽可能选择较多个数,最多为b[i]=m/c[i-1];,然后更新m,直到m为0

代码如下:

解释:由这里由m%c2=。。。可得(m-。。。)\c2=b3

 因此b[i]=m/c[i-1]

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30;
int n,m;
int a[N],b[N],c[N];//按照题目要求设置
int main()
{
    cin>>n>>m;
    c[0]=1;//初始化c[0]
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        c[i]=c[i-1]*a[i];//根据定义求c[i]
    }
    for(int i=n;i>=1;i--)
    {
        b[i]=m/c[i-1];//b[i]为能选择的c[i-1]最大个数
        m -= b[i]*c[i-1];
    }
    for(int i=1;i<=n;i++)
    {
        cout<<b[i]<<" ";
    }
    return 0;
}

代码二:(简单易懂版),由题目提示反向计算

#include<stdio.h>
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
 
    int i;
    int a[21] = { 0 };
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }
 
    int tmp = 1;
    int c[21] = { 0 };
    c[0] = 1;
    for (i = 1; i <= n; i++) //由a[i]计算c[i]
    {        
        tmp *= a[i];
        c[i] = tmp;
    }
 
    int b[21] = { 0 };
    tmp = 0;
    for (i = 1; i <= n; i++) //先存整个Ci-1 × Bi
    {    
        b[i] = m % c[i] - tmp;
        tmp += b[i];
    }
 
    for (i = 1; i <= n; i++)
    {
        printf("%d ", b[i] / c[i - 1]);//最后输出再除以Ci-1
    }
    return 0;
}

转自:https://blog.csdn.net/m0_53641110/article/details/127130488

           (15条消息) CCF-CSP 202209-1 如此编码 C语言 满分代码_想学好编程的ad的博客

posted on 2022-10-19 14:22  HIVhhxx  阅读(113)  评论(0)    收藏  举报

导航