CSP2022-09

闲时记录 / 2023-05-03 / 原文

第一题

 不给提示可能还真想不到,按照提示写就行

 

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