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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值