
这道题是一个模拟题,通过模拟按顺序接单的过程,用一个数组模拟火车行驶时的座位状况得出答案,数据也很水,$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:要记得只有同意预定方案才能更改数组。

这道题的思维量比较大:首先,我们可以枚举答案k,接下来就是如何验证是否可行了,对于每两头牛$a$、$b$,他们如果满足 $a\%k\equiv b\%k$ 那么k是无法满足题目需求的。那么,如何判断ab是否同余k呢?这里可以用到一个定理,若$a\%k\equiv b\%k$,则:
所以,只需要求出每两头奶牛的差,然后就可以求出所有不满足条件的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:不会超市的,相信我。

哈哈哈哈哈,这是我第一道在动态规划上有所成就的题!这是一道线性dp题,不过数组是二维的,知周所众,一个完美的dp题有三个要点:状态、动转、答案。所以……开始吧!
$dp_{i,0}:$在前$i$个数中,且第$i$个数并没有进行操作时,序列的最大同调等级, $dp_{i,1}$:在前$i$个数中,且第$i$个数进行了操作时,序列的最大同调等级