Codeforces Round 901 (Div. 2)

Problem - A - Codeforces

贪心

每次都先让b减到1,然后再去选择工具来增加时间

AC代码:

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=110;
int x[N];
int a,b,n;
void solve() {
    cin>>a>>b>>n;
    for(int i=1;i<=n;i++) cin>>x[i];
    sort(x+1,x+1+n);
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=b-1;
        b=1;
        b=min(b+x[i],a)-1;
        ans++;
    }
    ans+=b;
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - B - Codeforces

一开始只记录a,b的最小值和最大值,没有考虑到a的最小值去换b的最大值,然后b的最小值去换a的最大值时可能b的最小值不是刚换过来的a的最小值

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=55;
int a[N],b[N];
int n,m,k;
void solve() {
    cin>>n>>m>>k;
    int mina=2e9,minb=2e9;
    int maxa=0,maxb=0;
    int ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        ans+=a[i];
        mina=min(mina,a[i]);
        maxa=max(maxa,a[i]);
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
        minb=min(minb,b[i]);
        maxb=max(maxb,b[i]);
    }
    if(mina>=maxb){
        if(k%2==0) ans=ans-maxa+minb;
    }
    else{
        if(k%2==1) ans=ans-mina+maxb;
    }
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

最优策略就是用最小值去换最大值

可以模拟第一回合和第二回合的情况,这样就涵盖了所有的情况了,当k为奇数时,和第一回合答案一样,当k为偶数时,和第二回合答案一样

AC代码:

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=55;
int a[N],b[N];
int n,m,k;
void solve() {
    cin>>n>>m>>k;
    int ans1=0,ans2=0;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>b[i];
    sort(a+1,a+1+n);
    sort(b+1,b+1+m);
    if(a[1]>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - C - Codeforces

如果用小数做的话,由于数过于大,会有精度问题

错误代码:

#include
#define endl '\n'
#define int long long
using namespace std;
int n,m;
void solve() {
    cin>>n>>m;
    if(n%m==0){
        cout<<0<m) n%=m;
    double x=(double)n/m;
    double y=0.5;
    if(x0.5){
        if(x0){
        d-=diff;
    }
    if(d!=0){
        cout<<-1<>t;
    while(t--) {
        solve();
    }
    return 0;
}

f(n,m)表示n个苹果均分给m个人的次数

Codeforces Round 901 (Div. 2)_第1张图片

由于m最大1e9,n最小为1,所以最多log1e9次,大概30次

AC代码:

#include
#define endl '\n'
#define int long long
using namespace std;
int n,m;
void solve() {
    cin>>n>>m;
    n%=m;
    int ans=0;
    int cnt=0;
    while(n){
        ans+=n;
        n*=2;
        n%=m;
        cnt++;
        if(cnt>30) break;
    }
    if(n%m){
        cout<<-1<>t;
    while(t--) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(codeforces,算法,c++)