第五届NWU ACM-ICPC新生赛E题题解

E.zy与魔法石

tag:模拟,贪心

cf分值:1400

出题人前言:本来想着这个题大家推出规律就可以直接模拟AC的,因为数据范围给的挺舒适,本来定位是签到题级别的。但是现场只有Aklice一个人过,作为出题人还是觉得很不满意的,很多人是题读错了。

解法:推出规律其实发现,n大小的背包想尽可能多装不同的数,所以只需要模拟就行,先从小到大(从2开始)塞,塞到足够大之后发现会有一些是多余的,这个时候再反向往前塞就行。注意一下当n=1时的特判。

std代码:

#include<bits/stdc++.h>
using namespace std;

const int mod=1e9+7;

int main(){
    int n;
    cin>>n;
    if(n==0){
        cout<<0;
        return 0;
    }
    int temp=0,p=1;
    for(int i=2;i<=n;i++){
        if(temp+i>n) break;
        temp+=i;
        p=i;
    }
    n-=temp;
    long long r=1;
    for(int i=p;i>=2;i--){
        if(i==p && n-(p-1)>0) r=(r*(p+2))%mod;
        else if(n>0) r=(r*(i+1))%mod, n--;
        else r=r*i%mod;
    }
    cout<<r;
}
View Code
原文地址:https://www.cnblogs.com/Anonytt/p/14164883.html