Educational Codeforces Round 112 (Rated for Div. 2)

目录

A题目在这里

 代码

B题目在这里

C题目在这里

代码


A题目在这里

每一片Pizza花费2.5分钟,所以尽可能地让 n 被6,8,10分割且不剩余就可以,当 n<6 时,必须做一块小披萨,花费 15 分钟,当 n>=6 且 n 为 偶数 时,必然可以 被6,8,10分割 且不剩余,下面证明一下,想要让这个成立 ,则必须有

 2k=6a+8b+10c(k>=3,a,b,c \epsilon Z )

先假设其成立,则

2(k+1)=6(a-1)+8(b+1)+10c(k>=3,a,b,c\epsilon Z)

所以对于任意的 n>=6的偶数 总可以 被6,8,10不剩余的分割。

那么奇数呢,很简单,让 n=n+1变成偶数就好

所以当n<6

ans = 15

当  n>=6 时:

n为偶数时:ans=n*2.5

n为奇数时:ans = (n+1)*2.5

 代码

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

void solve(){
    long long n;
    cin>>n;
    long long ans;
    if (n<6)
        ans=15;
    else{
        if (n&1)
            ans=(n+1)*2.5;
        else 
            ans=n*2.5;
    }
    cout<<ans<<endl;
}

int main(){
    int t;
    cin>>t;
    while (t--)
    {
        solve();
    }
    return 0;
}

B题目在这里

C题目在这里

Alice想让分数最小化。Bob想让分数最大化。如果双方都以最佳状态比赛,游戏的分数会是多少?

每次都是Alice先走,所以Bob只能被动选择最优路线。首先,Alice的路径只有m个选项--从哪一列下去。Alice走完以后,Bob要么在第一列下去,要么在第二列下去,他的最优路径将是这两个选项中的一个。

预先处理前缀和,每次Alice选择完路径后,可确定Bob的最大分数,进而迭代Alice需要的最小分数

m=12举例

123456789101112

定义数组

const int MAXN=10005;
int a[MAXN];//第一列
int b[MAXN];//第二列
int suma[MAXN];//第一列前缀和
int sumb[MAXN];//第二列前缀和
suma[0]=0;
sumb[0]=0;

当Alice从第 1 列下去

Bob 的 分数为:max(suma[12]-suma[1]  , sumb[0])(已经让sumb[0]=0)

 当Alice从第 2 列下去

Bob 的 分数为:max(suma[12]-suma[2]  , sumb[1]) 

当Alice从第 3 列下去

Bob 的 分数为:max(suma[12]-suma[3]  , sumb[2]) 

 ...

当Alice从第 i 列下去

Bob 的 分数为:max(suma[12]-suma[i]  , sumb[i-1]) 

 所以每次得出Bob的分数后,和 ans 取min(),就是最后的答案

代码

#include<bits/stdc++.h>
using namespace std;
void solve(){
    int a[100005],b[100005],suma[100005],sumb[100005];
    int m,ans=1e9+5;
    cin>>m;
    for(int i=1;i<=m;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];
    suma[0]=0;
    sumb[0]=0;
    suma[1]=a[1];
    sumb[1]=b[1];
    for(int i=2;i<=m;i++)suma[i]=suma[i-1]+a[i];
    for(int i=2;i<=m;i++)sumb[i]=sumb[i-1]+b[i];

    for (int i=1;i<=m;i++){
        ans=min(ans,max(suma[m]-suma[i],sumb[i-1]));
    }

    cout<<ans<<endl;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值