开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}