题解:

T1(火车线路):

image.png

这道题是一个模拟题,通过模拟按顺序接单的过程,用一个数组模拟火车行驶时的座位状况得出答案,数据也很水,$10^7$也不会超市。

部分代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll o[100005], d[100005], n[100005];
ll ans[60005];
int main(){
    ll c, s, r;
    cin >> c >> s >> r;
    for(ll i=1;i<=r;i++){
        cin >> o[i] >> d[i] >> n[i];
        ll h=0;
        for(ll j=o[i];j<d[i];j++){
            if(ans[j]+n[i]>s){
                cout << 'N' << endl;
                h=1;
                break;
            }
        }
        if(!h){
            for(ll j=o[i];j<d[i];j++){
                ans[j]+=n[i];
            }
            cout << 'T' << endl;
        }
    }
}

PS:要记得只有同意预定方案才能更改数组。

T2(奶牛卧室):

image.png

这道题的思维量比较大:首先,我们可以枚举答案k,接下来就是如何验证是否可行了,对于每两头牛$a$、$b$,他们如果满足 $a\%k\equiv b\%k$ 那么k是无法满足题目需求的。那么,如何判断ab是否同余k呢?这里可以用到一个定理,若$a\%k\equiv b\%k$,则:

$(a-b)\%k=0$

所以,只需要求出每两头奶牛的差,然后就可以求出所有不满足条件的k,最后选择符合条件的就可以了。

部分代码:

    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=n;j++){
            ll k=abs(a[i]-a[j]);
            mp[k]=1;
        }
    }
    for(ll i=n;i<=100000;i++){
        for(ll j=i;j<=maxn;j++){
            if(!mp[j]){
                cout << j;
                return 0;
            }
        }
    }

PS:不会超市的,相信我。

T3(小信的同调序列):

image.png

哈哈哈哈哈,这是我第一道在动态规划上有所成就的题!这是一道线性dp题,不过数组是二维的,知周所众,一个完美的dp题有三个要点:状态、动转、答案。所以……开始吧!

状态定义:

$dp_{i,0}:$在前$i$个数中,且第$i$个数并没有进行操作时,序列的最大同调等级, $dp_{i,1}$:在前$i$个数中,且第$i$个数进行了操作时,序列的最大同调等级