闲话:今天是4年一度的奇观——2月29日!(地球人都知道)

所以为了纪念这个特殊的日子,我决定倒着讲。这是什么奇怪的规矩?(雾
Maximizing Productivity:
二分即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int c[maxn],t[maxn],opt[maxn];
int main(){
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>c[i];
	for(int i=1;i<=n;i++)
		cin>>t[i];
	for(int i=1;i<=n;i++){
		if(c[i]>t[i])
			opt[i]=c[i]-t[i];
		else
			opt[i]=-1;
	}
	sort(opt+1,opt+n+1,less<int>());
	while(q--){
		int v,s;
		cin>>v>>s;
		int pos=upper_bound(opt+1,opt+n+1,s)-opt;
		if((n-pos+1)>=v)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}
	return 0;
} 
Milk Exchange:
首先,我们可以模拟。
#include <bits/stdc++.h>
using namespace std;
int main(){
    int N,M;
	cin>>N>>M;
    string s;
	cin>>s;
	vector<long long> a(N),limit(N);
    for(int i=0;i<N;i++){
    	cin>>a[i];
    	limit[i]=a[i];
	}
    while(M--){
        vector<long long> cur=a;
        for(int i=0;i<N;i++){
            if(a[i]>=1){
                cur[i]--;
                if(s[i]=='L')
                    cur[(i-1+N)%N]++;
                else
                    cur[(i+1)%N]++;
            }
        }
        for(int i=0;i<N;i++)
            cur[i]=min(cur[i],limit[i]);
        a=cur;
    }
    cout<<accumulate(a.begin(),a.end(),0LL)<<endl;
    return 0;
} 
但是很显然,你会得到一个完美的TLE like this:

所以,怎么优化?
如果是R,
是L,那么我就叫这两个操作方向对应的两头奶牛称为两头"亏损对"这意味着,只要有牛奶给"亏损对",这部分奶必然会溢出。所以对于每一个"亏损对",只要求出可能被传递给它左右边的奶量,分别对m取最小值即可求出每个亏损对溢出的奶量。
//十年OI一场空,不开long long开祖宗
#include <bits/stdc++.h>
using namespace std;
int main(){
    int N,M;
	cin>>N>>M;
    string s;
	cin>>s;
    vector<int> a(N);
    for(int i=0;i<N;i++)
    	cin>>a[i];
    vector<bool> badl(N),badr(N);
    for(int i=0;i<N;i++){
        if(s[i]=='R' && s[(i+1)%N]=='L'){
            badl[i]=true;
            badr[(i+1)%N]=true;
        }
    }
    int ans=accumulate(a.begin(),a.end(),0LL);
    for(int i=0;i<N;i++){
        int sum=0;
        if(badl[i]){
            int j=(i-1+N)%N;
            while(s[j]=='R'){
                sum+=a[j--];
                if(j<0)
					j+=N;
            }
        }
        if(badr[i]){
            int j=(i+1)%N;
            while(s[j]=='L'){
                sum+=a[j++];
                if(j>=N)
					j-=N;
            }
        }
        ans-=min(sum,M);
    }
    cout<<ans<<endl;
    return 0;
} 
Palindrome Game:
这是一道结论题,但是我这种傻子不可能猜到的
先说结论:如果n是整十数,E胜,否则B胜。
首先,1到9都回文,所以此时先手必胜。如果呢?很简单,先手直接把n变成10就赢了。所以,整十数是一个必胜点,每次踩到上面就可以了。代码就很简单啦↓
#include <bits/stdc++.h>
using namespace std;
int main(){
	int tc;
	cin>>tc;
	while(tc--){
		int S;//注意开string
		cin>>S;
		if(S%10==0)
			cout<<'E'<<endl;
		else
			cout<<'B'<<endl;
	}
	return 0;
} 
以上就是本期的全部内容了。我们下期再见ヾ( ̄▽ ̄)Bye~Bye~
友情提醒:本期的全部代码都有问题,请不要无脑Ctrl C+Ctrl V





![LeetCode 刷题 [C++] 第148题.排序链表](https://img-blog.csdnimg.cn/direct/b193a3fe3fe54b78978f5cac95c351be.png)













