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的值去凑一个整数m,c[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

浙公网安备 33010602011771号