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 }
浙公网安备 33010602011771号