昨天就睡了三个小时,没打这次的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; }
|