Codeforces Round 1078 (Div. 2) 5/7

A. Lawn Mower

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long; 
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;

void solve(){
    int n,w;
    cin>>n>>w;

    cout<<n-n/w<<endl;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--) solve();

    return 0;
}

B. Offshores

先预处理出来把所有钱都取出来的结果 \(sum\)

再枚举每一个银行,如果把钱存到当前银行,可以用 \(sum\) 计算出结果,对所有结果取最值即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long; 
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;

void solve(){
    int n,x,y;
    cin>>n>>x>>y;

    int ans=0,sum=0;

    vector<int> a(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i]/x;
    }

    for(int i=1;i<=n;i++){
        ans=max(ans,a[i]+y*(sum-a[i]/x));
    }

    cout<<ans<<endl;

}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--) solve();

    return 0;
}

C. Secret message

循环节长度一定是 \(n\) 的因数,处理出因数然后对每个因数暴力就好了

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long; 
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;

const int mx=50000;

void solve(){
    int n,k;
    cin>>n>>k;

    vector<string> s(k+1);

    for(int i=1;i<=k;i++){
        cin>>s[i];
        s[i]=" "+s[i];
    } 

    vector<int> t;
    for(int i=1;i<=n;i++){
        if(n%i==0) t.push_back(i);
    }

    for(auto len:t){
        int tar=n/len;
        bool f=1;
        string ans;

        //len 是循环节的长度

        for(int i=1;i<=len;i++){
            vector<int> cnt(200);
            for(int j=i;j<=n;j+=len){
                //位置j
                vector<int> tcnt(200);
                for(int x=1;x<=k;x++){
                    tcnt[s[x][j]]++;
                }
                for(int x='a';x<='z';x++){
                    if(tcnt[x]) cnt[x]++;
                }
            }
            int tf=0;
            for(int j='a';j<='z';j++){
                if(cnt[j]==tar){
                    tf=1;
                    ans.push_back((char)j);
                    break;
                }
            }
            f*=tf;
        }

        if(f){
            for(int i=1;i<=tar;i++){
                cout<<ans;
            }
            cout<<endl;
            return;
        }
    }

}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--) solve();

    return 0;
}

D. Table Cut

这能是 div2 的 D?

让乘积尽可能大,则两边一边一半

从下往上,从左往右找出前一半个 \(1\),然后把他们切下来就好了

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long; 
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;

void solve(){
    int n,m;
    cin>>n>>m;
    vector g(n+1,vector<int>(m+1));

    int sum=0;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
            sum+=g[i][j];
        }
    }

    vector<int> t(m+1,n+1);
    t[0]=1;
    int cnt=sum/2;

    for(int i=n;i>=1;i--){
        for(int j=1;j<=m;j++){
            if(g[i][j]!=1) continue;
            cnt--;
            t[j]=i;
            if(cnt==0) break;
        }
        if(cnt==0) break;
    }

    cout<<sum/2 * ((sum+1)/2)<<endl;

    for(int i=m-1;i>=1;i--){
        t[i]=min(t[i+1],t[i]);
    }
    
    int now=1;
    for(int i=1;i<=m;i++){
        for(int j=now;j<t[i];j++){
            cout<<'D';
            now++;
        }
        
        cout<<'R';
    }
    while(now<n+1){
        cout<<"D";
        now++;
    }
    cout<<endl;
    
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--) solve();

    return 0;
}

E. The Turtle Strikes Back

VP 时读错题了,读成了,修改一次走一步,修改一次走一步这样的,完全不可做

然后才发现居然是只在一开始修改一次。

直接枚举修改的格子就好了

对当前被修改的格子,只有选或不选两种结果

如果选的话,直接走就行

矩形的每条副对角线只会且一定会走过一个格子

如果不选,则一定是走了当前格子所在副对角线上的其他格子,找个最大值就行

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
using ll=long long; 
using pii=pair<int,int>;
const ll inf = 1e18;
const int mod = 1e9+7;

void solve(){
    int n,m;
    cin>>n>>m;

    vector a(n+3,vector<int>(m+3,-inf));
    auto f1=a,f2=a;
    f1[0][1]=0;
    f2[n+1][m]=0;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            f1[i][j]=max(f1[i-1][j],f1[i][j-1])+a[i][j];
        }
    }

    for(int i=n;i>=1;i--){
        for(int j=m;j>=1;j--){
            f2[i][j]=max(f2[i+1][j],f2[i][j+1])+a[i][j];
        }
    }

    vector<pii> b(n+m+10,{-inf,-inf});
    

    //b=y-x

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int pos=j+i;
            int val=f1[i][j]+f2[i][j]-a[i][j];

            if(b[pos].first<val){
                b[pos].second=b[pos].first;
                b[pos].first=val;
            }
            else if(b[pos].first==val){
                 b[pos].second=val;
            }
            else{
                b[pos].second=max(val,b[pos].second);
            }
        }
    }

    int t=inf;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int ans=-inf;
            ans=max(ans,f1[i][j]+f2[i][j]-3*a[i][j]);

            int val=f1[i][j]+f2[i][j]-a[i][j];
            int pos=j+i;

            if(val==b[pos].first){
                ans=max(ans,b[pos].second);
            }
            else{
                ans=max(ans,b[pos].first);
            }
            t=min(t,ans);
        }
    }

    cout<<t<<endl;

}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int ct=1;
    cin>>ct;
    while(ct--) solve();

    return 0;
}
posted @ 2026-03-14 21:21  LYET  阅读(5)  评论(0)    收藏  举报