牛客练习赛141

A.小柒与啦啦啦的博弈

签到题,从大到小排序后,按顺序依次拿就可以了。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef long long LL;
 5 const int N = 1e6+10;
 6 int q[N];
 7 int main(){
 8     int n;
 9     cin>>n;
10     for(int i=0;i<n;i++) cin>>q[i];
11     sort(q,q+n,greater<int>());
12     LL s1=0,s2=0;
13     for(int i=0;i<n;i++){
14         if(i%2==0) s1+=q[i];
15         else s2+=q[i];
16     }
17     cout<<s1<<' '<<s2<<endl;
18     return 0;
19 }

B.小柒的交替数组

每次操作能改变数组中一个数字的奇偶性,问最少要多少次操作能得到一个长为m的子数组。

从后往前枚举,维护从当前数字为奇数到尾部所需要的操作次数,对应于odd数组,同时维护当前数字为偶数的env数组。

从而使得可以在线性时间内获得答案。

 1 #include<iostream>
 2 using namespace std;
 3 const int N = 1e5+10;
 4 int q[N],odd[N],env[N];
 5 int main(){
 6     int n,m;
 7     cin>>n>>m;
 8     for(int i=1;i<=n;i++){
 9         cin>>q[i];
10     }
11     int res=0x3f3f3f3f;
12     for(int i=n;i>=1;i--){
13         if(q[i]%2==0){
14             env[i]=odd[i+1];
15             odd[i]=env[i+1]+1;
16         }else{
17             env[i]=odd[i+1]+1;
18             odd[i]=env[i+1];
19         }
20         if(n-i+1>=m){
21             if(m%2==1){
22                 res=min(res,odd[i]-env[i+m]);
23                 res=min(res,env[i]-odd[i+m]);
24             }else{
25                 res=min(res,odd[i]-odd[i+m]);
26                 res=min(res,env[i]-env[i+m]);
27             }
28         }
29     }
30     cout<<res<<endl;
31     return 0;
32 }

C.小柒的幸运数

一个字符串的分数定义为字符串逆序对的数量,当 r 往右扩展一个字符时,分数+=左边大于这个字符的数目,当 l 往右,分数-=右边小于这个字符的数目。

要求一个子串使得abs(points-x)最小,可用双指针来维护。

 1 #include<iostream>
 2 using namespace std;
 3 typedef long long LL;
 4 int cnt[26];
 5 int main(){
 6     string s;
 7     LL x;
 8     cin>>s>>x;
 9     LL sum=0;
10     LL l=0;
11     LL res=0x3f3f3f3f3f3f3f3f;
12     for(int r=0;r<s.size();r++){
13         LL v=s[r]-'a';
14         for(int i=v+1;i<26;i++)
15             sum+=cnt[i];
16         cnt[v]++;
17         res=min(res,abs(sum-x));
18         while(l<=r&&sum>=x){
19             for(LL i=0;i<s[l]-'a';i++)
20                 sum-=cnt[i];
21             res=min(res,abs(sum-x));
22             cnt[s[l]-'a']--;
23             l++;
24         }
25     }
26     cout<<res<<endl;
27     return 0;
28 }

 

posted on 2025-06-21 14:05  greenofyu  阅读(19)  评论(0)    收藏  举报