CSP2022-09
第一题
不给提示可能还真想不到,按照提示写就行
#include <cmath> #include <iostream> #include <iomanip> using namespace std; const int N = 1e6+10 ; int n,m ; int a[N],b[N],c[N] ; int mul[N] ; int main(){ c[0] = 1; cin>>n>>m ; for(int i=1; i<=n; i++) scanf("%d", &a[i]) ; for(int i=1; i<=n; i++) { c[i] = c[i-1]*a[i]; mul[i] = m % c[i] ; } for(int i=1; i<=n; i++) { b[i] = ( mul[i] - mul[i-1] ) / c[i-1] ; } for(int i=1; i<=n; i++) printf("%d ", b[i]); return 0 ; }
第二题
近似为01背包问题来做就行,直接ac
#include <iostream> #include <algorithm> using namespace std; const int N = 1e6+10 ; // 0 1背包问题 int n,x ; int v[N] ; int f[N] ; // 前i个中体积不超过sum的选择 int main(){ cin>>n>>x; int sum = 0; for(int i=1; i<=n; i++) { scanf("%d", &v[i]) ; sum += v[i] ; } for(int i=1 ; i<=n; i++ ) for(int j=sum ; j>=v[i]; j--) { f[j] = max(f[j], f[j-v[i]] + v[i]); } for(int j=0; j<=sum; j++) if(f[j]>=x) { cout<<f[j]<<endl; break ; } return 0 ; }