昨天就睡了三个小时,没打这次的cf,今早来补题了

这次比较简单,觉得前两题没什么好写的

C

在关机开机和一直开机里取最优,然后贪心模拟,如果小于等于0就不可以,反之OK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#include<bits/stdc++.h>
using i64=long long;
#define rep(a,n) for(i64 i=(a);i<=(n);i++)
#define per(a,n) for(i64 i=(n);i>=(a);i--)
#define mst(a,x) memset(a,x,sizeof(a))
const int INF=0x3f3f3f3f,N=12;
using namespace std;
void solve(){
i64 n,f,a,b;cin>>n>>f>>a>>b;
vector<i64>v(n+1);
for(int i=1;i<=n;i++)cin>>v[i];
for(int i=1;i<=n;i++){
f-=min((v[i]-v[i-1])*a,b);

if(f<=0){
cout<<"NO\n";
return;
}
}
cout<<"YES\n";
}


int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;cin>>T;
while(T--)solve();
return 0;
}

D

a数组递增排序,b数组递减排序

很明显一定是按这样a与b之间的差值尽量大才能保证总的绝对值的和尽量大,双指针维护取数比较大小直到取完就可以

注意开i64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

#include<bits/stdc++.h>
using i64=long long;
#define rep(a,n) for(i64 i=(a);i<=(n);i++)
#define per(a,n) for(i64 i=(n);i>=(a);i--)
#define mst(a,x) memset(a,x,sizeof(a))
const int INF=0x3f3f3f3f,N=12;
using namespace std;
void solve(){
i64 n,m;cin>>n>>m;
vector<i64>a(n);
vector<i64>b(m);
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<m;i++)cin>>b[i];
sort(a.begin(),a.end());
sort(b.begin(),b.end(),greater<int>());
i64 ans=0,cnt=0;
i64 i1=0,i2=0,j1=n-1,j2=m-1;
while(i1<=j1){
if(abs(b[j2]-a[j1])>abs(a[i1]-b[i2])){
ans+=abs(b[j2]-a[j1]);
j2--;
j1--;

}else{
ans+=abs(b[i2]-a[i1]);
i1++;
i2++;

}
}
cout<<ans<<'\n';
}


int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;cin>>T;
while(T--)solve();
return 0;
}