Codeforces Round #643 (Div. 2)

A

等到 \(0\) 出现后就退出

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1000005;

int solve(int x) {
    int mn=9,mx=0;
    while(x>0) {
        int p=x%10;
        mn=min(mn,p);
        mx=max(mx,p);
        x/=10;
    }
    return mn*mx;
}

signed main() {
    int t;
    cin>>t;
    while(t--) {
        int x,k;
        cin>>x>>k;
        --k;
        while(solve(x) && k) x+=solve(x), --k;
        cout<<x<<endl;
    }
}

B

排序后贪心分组即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

int t,n,a[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--) {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+n+1);
        int ans=0,cnt=0;
        for(int i=1;i<=n;i++) {
            ++cnt;
            if(a[i]<=cnt) {
                cnt=0;
                ++ans;
            }
        }
        cout<<ans<<endl;
    }
}

C

\(f[i]\) 表示满足条件的 \(x+y=i\)\((x,y)\) 数,然后利用 \(f[]\) 的后缀和算答案即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1200005;

int a,b,c,d,e,f,ans,F[N];

signed main() {
    cin>>a>>b>>e>>f;
    c=b;d=e;
    for(int i=1;i<=1e6+8;i++) {
        int x1=i>a+d?i-d:a;
        int x2=i>b+c?b:i-c;
        F[i]=max(0ll,x2-x1+1);
    }
    for(int i=1e6+5;i>=1;--i) F[i]+=F[i+1];
    for(int i=e;i<=f;i++) ans+=F[i+1];
    cout<<ans<<endl;
}

D

每个位置分 \(2\),最后一个把余下的全部拿走,不够分则挂。令 \(k=1\)

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1000005;

int n,s,a[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>s;
    if(s<2*n) {
        cout<<"no";
    }
    else {
        cout<<"yes"<<endl;
        for(int i=1;i<n;i++) a[i]=2, s-=2;
        a[n]=s;
        for(int i=1;i<=n;i++) cout<<a[i]<<" ";
        cout<<endl;
        cout<<1<<endl;
    }
}

E

三分,检验答案时贪心,设 \(M=\min(M,A+R)\),然后能移动就移动即可

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1000005;

int n,A,R,M,a[N];

int check(int x) {
    int ans=0;
    int u=0,b=0;
    for(int i=1;i<=n;i++) {
        if(a[i]>x) u+=a[i]-x;
        if(a[i]<x) b+=x-a[i];
    }
    int d=abs(u-b),m=min(u,b);
    if(u>b) ans+=d*R;
    if(b>u) ans+=d*A;
    ans+=m*M;
    return ans;
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>A>>R>>M;
    if(A+R<M) M=A+R;
    for(int i=1;i<=n;i++) cin>>a[i];

    int l=0,r=1e9;
    while(l<r) {
        int m1=(2*l+r)/3,m2=(2*r+l+2)/3;
        if(check(m1)<check(m2)) r=m2-1;
        else l=m1+1;
    }
    cout<<check(l)<<endl;
}

F

FST了,wa on test 38,就不贴了,待补

总结

F 题 FST 是意料之中的吧,前期题过得太慢了,被A题卡了一刻钟非常不应该

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12902680.html