A - Square
题意:
给出正方形的四个点,求的这个正方形的面积
思路:
用pair存,按照a.ff排序,a[0].ss-a[1].ss即正方形的边长
代码:
/*
* @Author :
* @LastEditTime : 2024-01-15 22:41:41
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
vector<pi> a(4);
for(int i=0;i<4;i++){
cin>>a[i].ff>>a[i].ss;
}
sort(a.begin(),a.end(),[](pi a,pi b){
return a.ff>b.ff;
});
int x=abs(a[0].ss-a[1].ss);
cout<<x*x<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}
B - Arranging Cats
题意:
给出两个只包含01的字符串a和b,求出将字符串a转换成字符串b所需要的最少次数,其中a中的1可以换位置,多余的1要去除。
思路:
求出ai和bi不同的时候ai是1的个数sums,bi是1的个数sumf,最后的答案就是max(sums,sumf)。
代码:
/*
* @Author :
* @LastEditTime : 2024-01-15 22:54:08
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
int n;cin>>n;
string s,f;cin>>s>>f;
int cnt=0,sums=0,sumf=0;
for(int i=0;i<n;i++){
if(s[i]!=f[i]) {
cnt++;
if(s[i]=='1') sums++;
else sumf++;
}
}
if(cnt==0) cout<<0<<endl;
else{
cout<<max(sums,sumf)<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}
C - Sending Messages
题意:
某人需要在n个时间点发短信,他的手机每一秒要消耗的电量是a,开关一次机消耗的电量是b,初始手机电量是f,判断他能否发完消息。
思路:
每次发消息所需要的最少电量为min((a[i]-a[i-1])*a,y) 最后累加判断是否超过f即可
代码:
/*
* @Author :
* @LastEditTime : 2024-01-15 23:13:46
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
int n,be,x,y;cin>>n>>be>>x>>y;
vector<int> a(n+1);
int sum=0;
for(int i=1;i<=n;i++) {
cin>>a[i];
if(i==1){
if(a[i]*x>y) sum+=y;
else sum+=a[i]*x;
}else{
if((a[i]-a[i-1])*x>y) sum+=y;
else sum+=(a[i]-a[i-1])*x;
}
}
if(sum>=be) cout<<"NO"<<endl;
else cout<<"Yes"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}
D - Very Different Array
题意:
给定一个长度为n的数组,要求从一个长度为m的数组中选取n个数字组成一个长度为n的数组,使得|ai-bi|的和最大。
思路:
贪心,首先将两个数组排序,对于某个数,如果要选择b数组中间的某个数,那么一定存在比bi大的数和比bi小的数,故从b数组两边选所得结果|ai-bi|一定最大。
从a0开始与bm-1匹配求前缀和pre[i],从an-1开始与b0求后缀和re[i],ans=Max(ans,pre[i]+re[i]);
代码:
/*
* @Author :
* @LastEditTime : 2024-01-16 16:00:40
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n,m;cin>>n>>m;
vector<int> a(n),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());
vector<int> pre(n+1,0),re(n+1,0);
int l=0,r=m-1;
for(int i=1;i<=n;i++){//前缀和
pre[i]=pre[i-1]+abs(b[r]-a[i-1]);
r--; //!
}
for(int i=n;i>0;i--){//后缀和
re[i-1]=re[i]+abs(b[l]-a[i-1]);
l++; //!
}
int ans=0;
for(int i = 0; i <= n; i ++ ) ans=max(ans,pre[i]+re[i]);
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}