牛客小白月赛63 D,E

108 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

D-Ginger的大花环

思路:一看题目感觉像是dp,但其实稍微分析一下就可以看出这就是一个简单的贪心
当只有一种颜色的时候显然不可以;其实颜色需要两种就够了,分别是最小值和次小值,对于第i个花朵我们一定希望用最小值来染他,但是如果第i-1和第i-2朵都是用的最小值染的话那么第i朵就只能染次小值了;否则还需要看看第i+1和第i+2朵是否都是最小值染的,如果都是那么第i朵只能染次小值否则可以染最小值,其实后者这种情况只有当i==n的时候才会出现,但每次都判断一下也没啥错误

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=1e6+100;
int n,k,w[N],a[N]={0};
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=k;i++) cin>>w[i];
    for(int i=1;i<=n;i++) a[i]=0;
    sort(w+1,w+k+1);
    if(k<=1)
    {
        cout<<"Ginger666\n";
        return 0;
    }
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        int x=(i-1+n)%n,y=(i-2+n)%n;
        if(x==0) x=n;
        if(y==0) y=n;
        if(a[x]==w[1]&&a[y]==w[1]) a[i]=w[2],sum+=w[2];
        else
        {
            int x1=(i+1)%n,y1=(i+2)%n;
            if(x1==0) x=n;
            if(y1==0) y=n;
            if(a[x1]==w[1]&&a[y1]==w[1]) a[i]=w[2],sum+=w[2];
            else a[i]=w[1],sum+=w[1];
        }
    }
    cout<<sum<<endl;
    return 0;
}

E-最值区间计数

思路:先固定最小值1,当1在1的位置上时,n会有n-1种选择,分别是2,3,,,n(此处代表的是位置),当1在2的位置上时,n会有n-2种选择,即当1在i(i<n)的位置上时,n有n-i种操作,然后其他的数全排列,再乘以2,乘2是因为1和n可以互换位置,然后从1到n-1枚举1的位置就可以了,注意1的位置不能是n,位置是n的话,n就没有位置可以选的了,因为枚举默认的是n的位置大于1的位置的情况;不要忘了特判n=1的情况

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const ll mod=998244353;
const int N=1e6+100;
int n,fac[N];
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    fac[0]=1;
    for(int i=1;i<=N-100;i++) fac[i]=fac[i-1]*i%mod;
    cin>>n;
    if(n==1)
    {
        cout<<"1\n";
        return 0;
    }
    int p=fac[n-2]*2LL%mod,ans=0,inv=getinv(2);
    for(int i=1;i<=n-1;i++)
    {
        int sum=((n-i)*(n-i+1)%mod)*inv%mod;
        ans=(ans+(i*sum%mod)*p%mod)%mod;
    }
    cout<<ans<<endl;
    return 0;
}