第一次训练赛题解
这场比赛挂了几道牛客上的题目,比赛地址:https://www.nowcoder.com/acm/contest/118815。【邀请码:nuc2025】
下面是题解内容:
A:
链接: A-A_NUC第一次训练赛
思路:
直接暴力即可,反正范围也不大。
暴力代码:
#include<bits/stdc++.h>
using namespace std;
int main(){int l,r;cin>>l>>r;int cnt=0;for(int i=l;i<=r;i++)if(i%2==0)cnt++;cout<<cnt<<'\n';return 0;
}
或者也可以直接利用前缀和思想,我们可以很容易知道区间【1,n】中有多少个数满足2的倍数,且【l,r】=【1,r】-【1,l-1】。
所以也可以按照如下写法进行优化。
优化代码:
#include<bits/stdc++.h>
using namespace std;
int main(){int l,r;cin>>l>>r;cout<<r/2-(l-1)/2<<'\n';return 0;
}
B:
链接: B-B_NUC第一次训练赛
思路:
开2个数组cnt1和cnt2,分别存储 字符串前一半或者后一半 每个小写字母出现的次数。
然后我们想要变成双生数组,就需要分别对cnt1、cnt2找到其中出现次数最多的相加,然后len-最多次数即为答案。
AC代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int cnt1[50],cnt2[50];
int main(){cin>>s;int len=s.size();s=" "+s;for(int i=1;i<=len;i++){int x=s[i]-'a';if(i<=len/2)cnt1[x]++;elsecnt2[x]++;}int d1,d2;d1=d2=1e9;for(int i=0;i<26;i++){d1=min(d1,len/2-cnt1[i]);d2=min(d2,len/2-cnt2[i]);}cout<<d1+d2<<'\n';return 0;
}
C:
链接: C-C_NUC第一次训练赛
思路:
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
int n,x;
ll k;
int a[N],b[N];
int len;
int main(){cin>>n>>k>>x;for(int i=0;i<n;i++)cin>>a[i];ll c=(x-k%x)%x;for(int i=c;i<x;i++)b[len++]=a[i];for(int i=0;i<c;i++)b[len++]=a[i];for(int i=x;i<n;i++)b[len++]=a[i];for(int i=0;i<n;i++)cout<<b[i]<<' ';return 0;
}
D:
链接: D-D_NUC第一次训练赛
思路:
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e5+100;
ll n;
ll A[N];void init(){A[0]=1;for(int i=1;i<=n;i++)A[i]=A[i-1]*i%mod;
}int main(){cin>>n;init();ll a=n/2,b=n-n/2;ll ans;if(n%2==1){ans=A[a]*A[b]%mod;}else{ans=2*A[a]*A[b]%mod;}cout<<ans<<'\n';return 0;
}
E:
链接: E-E_NUC第一次训练赛


思路:

AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010;
int n,c,m;
ll dp[N][10];
//整体 0/1背包,遇到组合就分组背包
bool st[N];
ll a[N],b[N];int main(){cin>>n>>c>>m;for(int i=1;i<=n;i++)cin>>a[i]>>b[i];for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;st[u]=st[v]=true;for(int j=c;j>=min(a[v],a[u]);j--){for(int k=4;k>=1;k--){if(j>=a[v]+a[u]&&k>=2)dp[j][k]=max(dp[j][k],dp[j-a[v]-a[u]][k-2]+b[u]+b[v]+w);if(j>=a[v]&&k>=1)dp[j][k]=max(dp[j][k],dp[j-a[v]][k-1]+b[v]);if(j>=a[u]&&k>=1)dp[j][k]=max(dp[j][k],dp[j-a[u]][k-1]+b[u]);}} }for(int i=1;i<=n;i++){if(st[i]==false){for(int j=c;j>=a[i];j--)for(int k=4;k>=1;k--){dp[j][k]=max(dp[j][k],dp[j-a[i]][k-1]+b[i]);}}}cout<<dp[c][4]<<'\n';return 0;
}
F:
链接: F-F_NUC第一次训练赛


思路:

AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
int n;
int a[N];
ll cnt[20][20];
ll qmi(ll a,ll b,ll c){ll res=1;while(b){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;
}//返回x的位数
int len(int x){int r=0;while(x){x/=10;r++;}return r;
}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];int x,y;x=len(a[i]);y=a[i]%11;cnt[x][y]++;}ll ans=0;for(int i=1;i<=n;i++){int y=a[i]%11;for(int h=1;h<=9;h++){int r=(11-y*qmi(10,h,11)%11)%11;int res=cnt[h][r];if(y==r&&len(a[i])==h)res--;ans+=res;}}cout<<ans<<'\n';return 0;
}
G:
链接: G-G_NUC第一次训练赛


思路:


AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
ll n,k;
ll c[N];
bool st[N];int main(){cin>>n>>k;if(n*(n+1)/2+n<k||k<3*n-1){cout<<-1<<'\n';return 0;}ll d=k-(3*n-1);st[n-1]=true;for(int i=n-2;i>=1;i--){if(d>=i){d-=i;st[i]=true;}}int len=0;for(int i=1;i<n;i++){if(st[i]){c[++len]=i;}}for(int i=1;i<=n;i++){if(!st[i]){c[++len]=i;}}for(int i=1;i<=n;i++)cout<<c[i]<<' ';return 0;
}
H:
链接: H-H_NUC第一次训练赛

思路:

AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
ll n,k;
int a[N];
int main(){cin>>n>>k;if(k<(n+1)/2||k>=n){cout<<-1<<'\n';return 0;}ll c=k-(n+1)/2;for(int i=1,j=n;i<=n;i++,j--)a[i]=j;if(n%2==1)swap(a[n/2+1],a[n/2+2]);int i=1;while(c){c--;swap(a[i],a[i+1]);i+=2;}for(int i=1;i<=n;i++)cout<<a[i]<<' ';return 0;
}