Educational Codeforces Round 103 (Rated for Div. 2)

Educational Codeforces Round 103 (Rated for Div. 2)

A. K-divisible Sum

先保证sum大于k,ans=(sum+k-1)/k

#include <bits/stdc++.h>

#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int inf=1e18;
const int mod = 1e9 + 7;
const int maxn = 2e5 + 10;


void solve() {
    
    
    int n,k;
    cin>>n>>k;
    int sum=ceil(n*1.0/k)*k;
    int t=sum/n+(sum%n>0);
    cout<<t<<"\n";
}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}

B. Inflation

全加到p[0]上。

#include <bits/stdc++.h>

#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int inf=1e18;
const int mod = 1e9 + 7;
const int maxn = 2e5 + 10;

int p[maxn];

void solve() {
    
    
    int n,k;
    int ans=0, sum=0;
    cin>>n>>k;
    for (int i = 1; i <=n; ++i) {
    
    
        cin>>p[i];
        sum+=p[i];
    }
    for (int i = n; i >1 ; --i) {
    
    
        sum-=p[i];
        int x=k*sum-100*p[i];
        if (x<0){
    
    
            sum+=-(x-k+1)/k;///因为这里x<0,所以向上取整就要(x-k+1)/k;
            ///自己挖坑自己跳
        }
    }
    cout<<sum-p[1]<<"\n";
}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}

C. Longest Simple Cycle

如果不闭合增加c[i]+b[i]-a[i]+1,再把之前的加上;
遍历dp即可

#include <bits/stdc++.h>

#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int inf=1e18;
const int mod = 1e9 + 7;
const int maxn = 2e5 + 10;

int c[maxn],a[maxn],b[maxn];
int dp[maxn];

void solve() {
    
    
    int n;
    cin>>n;
    for (int i = 0; i < n; ++i) cin>>c[i];
    for (int i = 0; i < n; ++i) cin>>a[i];
    for (int i = 0; i < n; ++i) {
    
    
        cin>>b[i];
        if (a[i]>b[i]) swap(a[i],b[i]);
    }
    a[n]=b[n]=0;
    int res=0;
    for (int i = n-1; i >0; --i) {
    
    
        dp[i]=c[i]+b[i]-a[i]+1;
        if (a[i+1]!=b[i+1])
            dp[i]=max(dp[i],dp[i]+dp[i+1]-2*(b[i+1]-a[i+1]));
        res=max(res,dp[i]);
    }
    cout<<res<<"\n";
}

signed main() {
    
    
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}

D. Journey

设往左的边为1,右为0;要去的最远就要10交叉,否则为0;
ans=左右俩边能去的城市和

#include <bits/stdc++.h>

#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int inf=1e18;
const int mod = 1e9 + 7;
const int maxn = 3e5 + 10;

int l[maxn],r[maxn];
int a[maxn];

void solve() {
    
    
    string s;
    int n;
    cin>>n>>s;
    for (int i = 1; i <=n; ++i)
        if (s[i-1] == 'L') a[i]=1;
        else a[i]=0;
    l[0]=r[n+1]=0;
    for (int i = 1; i <=n; ++i)
        if (a[i]!=a[i-1]) l[i]=l[i-1]+1;
        else l[i]=1;
    for (int i = n; i >0; --i)
        if (a[i]!=a[i+1]) r[i]=r[i+1]+1;
        else r[i]=1;
    a[n+1]=0;
    for (int i = 0; i <=n; ++i) {
    
    
        cout<<1+l[i]*(a[i]==1)+r[i+1]*(a[i+1]==0)<<" ";
    }
    cout<<"\n";
}

signed main() {
    
    
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45436102/article/details/113417017