2025牛客寒假算法基础集训营6 ptlks的题解
A.复制鸡
题意:
反推原数列,求最短
思路
相同相邻的数可以合并。
代码
点击查看代码
int a[N];
void solve() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int s=0;
a[0]=-1;
for(int i=1;i<=n;i++){
if(a[i]!=a[i-1]){
s++;
}
}
cout<<s<<endl;
}
B.好伙计猜拳
题意:
求使序列合法的最少代价。
思路
直接dp即可,用map存状态。
代码
点击查看代码
void solve() {
int n,c1,c2;
cin>>n>>c1>>c2;
map<PII,int>m,m1;
m[{0,0}]=0;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
for(auto [u,s]:m){
auto[a,b]=u;
if(a<=x&&b<=y){
if(m1.count({x,y})==0)m1[{x,y}]=s;
else m1[{x,y}]=min(s,m1[{x,y}]);
}
if(a<=y&&b<=x){
if(m1.count({y,x})==0)m1[{y,x}]=s+c2;
else m1[{y,x}]=min(s+c2,m1[{y,x}]);
}
if(m1.count({a,b})==0)m1[{a,b}]=s+c1;
else m1[{a,b}]=min(s+c1,m1[{a,b}]);
}
m=m1;
m1.clear();
}
int mn=INT64_MAX;
for(auto[u,s]:m){
mn=min(mn,s);
}
cout<<mn<<endl;
}
C.数列之和
题意:
求题目所给第k大
思路
不难发现序列中均为偶数,且大于2的2的整数幂均为出现。
代码
点击查看代码
void solve() {
int k;
cin>>k;
int s=k*2;
int p=4;
while(p<=s){
s+=2;
p*=2;
}
cout<<s<<endl;
}
H.小鸡的排列构造
题意:
题目给了限制,要求构造排列。
思路
由于题目保证一组测试数据中输入的所有l,r的奇偶性相同,分奇数偶数构造,只要保证所有合法区间都满足题目限制即可。
代码
点击查看代码
void solve() {
int n,m;
cin>>n>>m;
int s=0;
for(int i=1;i<=m;i++){
int l,r,c;
cin>>l>>r>>c;
s=(r-l)%2;
}
if(s){
for(int i=n;i>0;i--){
cout<<i<<' ';
}cout<<endl;
}else{
int p=n;
cout<<p<<' ';
for(int i=p-2;i>=1;){
cout<<i<<' '<<i+1<<' ';
i-=2;
if(i==0){
cout<<1;
}
}
cout<<endl;
}
}
I.小鸡的排列构造的checker
题意:
询问区间内小于等于c的个数。
思路
主席树板子。
代码
点击查看代码
略
J.铁刀磨成针
题意:
求题目所给最大值。
思路
磨刀优先级最高,然后枚举开始攻击的时刻。
代码
点击查看代码
void solve() {
int n,x,y;
cin>>n>>x>>y;
int mx=0;
for(int i=1;i<=y&&i<=n;i++){
int s=0;
int xx=x+i;
if(y<=n){
s+=xx*(y-i+1);
if(y+xx<=n){
s+=(xx)*(xx-1)/2;
}else{
s+=(xx-(n-y)+xx-1)*(n-y)/2;
}
}else{
s+=xx*(n-i+1);
}
mx=max(mx,s);
}
cout<<mx<<endl;
}
K.鸡翻题
题意:
签到。
思路
见代码。
代码
点击查看代码
void solve() {
int x,y;
cin>>x>>y;
if((y-(x+x+1))%4==0){
cout<<"YES\n";
}else{
cout<<"NO\n";
}
}
K.鸡翻题
题意:
签到。
思路
见代码。
代码
点击查看代码
void solve() {
int x,y;
cin>>x>>y;
if((y-(x+x+1))%4==0){
cout<<"YES\n";
}else{
cout<<"NO\n";
}
}
L.变鸡器
题意:
签到。
思路
直接判断即可。
代码
点击查看代码
略

浙公网安备 33010602011771号