20230917普及组模拟赛题解

· · 个人记录

T1:

最大公约数与最小公倍数。注意数据范围,要用long long .

#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a,long long b)
{
    if(b==0) return a;
    else return gcd(b,a%b);
}
long long lcm(long long a,long long b)
{
 return a*b/gcd(a,b);
}
int main()
{
    long long a,b,c,i;
    cin>>a>>b>>c;
    i=lcm(a,b);
    cout<<lcm(i,c);
    return 0;
 } 

T2:

/*细节
判定无解
本题中答案为 
0
0 不代表无解,如

1 0
0 114514
有解且答案为 0.
因此可以将 
ans 预设为 −1,程序结束时ans 若仍为 −1 则无解。*/
#include<bits/stdc++.h>
#define N 1000001
using namespace std;
typedef long long ll;
ll n,k,x[N],ans=-1;
bool flag;
int main(){
    cin>>n>>k;
    for(ll i=1,a,b;i<=n;i++){
        cin>>a>>b;
        x[a]+=b;
    }
    for(ll i=0;i<N-k;i++){
        if(!(x[i]&&x[i+k])||(k==0&&x[i]<2))continue;
        if(k==0)ans=max(ans,x[i]*i);
        else ans=max(ans,min(x[i+k],x[i])*(2*i+k));
    }
    if(ans==-1)cout<<"NO"<<endl;
    else cout<<ans<<endl;
    return 0;
}

T3

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int N=2e5+10;
struct node{
    int k,id;
}a[N];
int n,b[N],c[N],ft[N],bk[N];
bool cmp(node x,node y){
    return x.k<y.k;
}
int main(){

    cin>>n;
    for(int i=1;i<=n+1;i++) cin>>a[i].k,a[i].id=i;
    for(int i=1;i<=n;i++) cin>>b[i];
    sort(a+1,a+n+2,cmp);
    sort(b+1,b+n+1);
    for(int i=1;i<=n;i++) ft[i]=max(ft[i-1],max(0,a[i].k-b[i]));
    for(int i=n;i>=1;i--) bk[i]=max(bk[i+1],max(0,a[i+1].k-b[i]));
    for(int i=1;i<=n+1;i++) c[a[i].id]=i;
    for(int i=1;i<=n+1;i++) cout<<max(ft[c[i]-1],bk[c[i]])<<' ';
    return 0;
}

T4:P6394 樱花,还有你

题目来源:P6394 樱花,还有你