首页 > 其他分享 >Codeforces Round 986 (Div. 2)

Codeforces Round 986 (Div. 2)

时间:2024-11-16 23:29:27浏览次数:1  
标签:pre int ll 986 Codeforces long solve Div include

Codeforces Round 986 (Div. 2) 总结

A

按题意模拟即可,因为 \(n,a,b\) 很小,可以多循环几遍来判断。只循环十遍的吃罚时 qwq。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=1;
int n,a,b;
string s;
void solve()
{
    cin>>n>>a>>b;
    cin>>s;
    int x=0,y=0;
    for(int j=0;j<100;j++)
    for(int i=0;i<n;i++)
    {
        if(s[i]=='N') y++;
        else if(s[i]=='E') x++;
        else if(s[i]=='S') y--;
        else x--;
        if(x==a&&y==b) 
        {
            cout<<"Yes\n";
            return;
        }
    }
    cout<<"No\n";
}
int main ()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

B

有点烦人的题,要分类讨论清楚。将一次操作中 \(x\) 变为 \(y\) 称为 \(x\) 移动到 \(y\)。

  • 若 \(b=0\),就是全是 \(c\),讨论一下 \(c\) 的值。
    • 当 \(c=n-1\) 时,可以将 \(n-1\) 个 \(c\) 移动到 \([0,n-2]\),代价为 \(n-1\)。
    • 当 \(c=n-2\) 时,将 \(n-2\) 个 \(c\) 移动到 \([0,n-3]\),再将一个 \(c\) 移动到 \(n-1\)。代价为 \(n-1\)。
    • 当 \(c<n-2\) 时,无论怎么操作,能移动到最大的数为 \(c+1\),所以不合法。
    • 当 \(c>n-1\) 时,就要将 \(n\) 个 \(c\) 移动到 \([0,n-1]\),代价为 \(n\)。
  • 若 \(b>0\),那么就是要将大于 \(n-1\) 的值都移动到 \([0,n-1]\),代价就是大于 \(n-1\) 的数的个数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=1;
ll n,b,c;
void solve()
{
    cin>>n>>b>>c;
    if(!b)
    {
        if(c<n-2) cout<<-1<<'\n';
        else 
        {
            if(c<=n-1) cout<<n-1<<'\n';
            else cout<<n<<'\n';
        }
        return ;
    }
    if(c>=n)
    {
        cout<<n<<'\n';
        return ;
    }
    ll k=max(0ll,n-1-c)/b+1;
    cout<<n-k<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}


C

首先切蛋糕时,一但大于 \(v\) 就会将其切开,最后将其中一些相邻的合并,使得块数刚好是 \(m+1\),合并出来的就是答案。所以答案肯定是中间的某一段的和。

设 \(b_i\) 为切到 \(i\) 为止,最多能分出多少块大于 \(v\) 的蛋糕。再从后往前,设 \(c_i\) 为切 \([i,n]\) 最多能分出多少块。对于每个 \(c_i\) 找到一个 \(b_n\),使得 \(c_i+b_j=m\),且 \(j\) 尽可能小。也就是说,将 \([1,j]\) 和 \([i,n]\) 的部分给别人,\([j+1,i-1]\) 的部分留给自己。用 map 记录 \(b_i\) 最早出现的位置,复杂度为 \(O(n)\)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m;
ll v;
ll a[N],b[N],c[N],pre[N];
void solve()
{
    cin>>n>>m>>v;
    for(int i=1;i<=n;i++) cin>>a[i],pre[i]=pre[i-1]+a[i];
    map<int,int> H;
    ll x=0;
    H[0]=0;
    for(int i=1;i<=n;i++)
    {
        b[i]=b[i-1];
        if(x<v) x+=a[i];
        if(x>=v) x=0,b[i]++;
        if(H.count(b[i])==0) H[b[i]]=i;
    }
    if(b[n]<m) 
    {
        cout<<-1<<'\n';
        return ;
    }
    c[n+1]=0,x=0;
    ll ans=pre[n]-pre[H[m]];
    for(int i=n;i>=1;i--)
    {
        c[i]=c[i+1];
        if(x<v) x+=a[i];
        if(x>=v) x=0,c[i]++;
        int j=H[m-c[i]];
        ans=max(ans,pre[i-1]-pre[j]);
    }
    cout<<ans<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

标签:pre,int,ll,986,Codeforces,long,solve,Div,include
From: https://www.cnblogs.com/zhouruoheng/p/18550074

相关文章

  • Refact.ai Match 1 (Codeforces Round 985)
    Refact.aiMatch1(CodeforcesRound985)总结A集合中的元素为\(l\lex\ler\),有\(k\)个\(x\)的倍数在其中才可删,可以求出最大可删的元素,直接计算。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#inclu......
  • 第九章DIV+CSS布局
    9.1DIV+CSS概述9.1.1认识DIVdiv标签在Web标准网页中属于块级元素9.1.2DIV的宽高设置9.1.2.1宽高属性9.1.2.2div标签内直接设置宽高9.1.2.3div使用选择器设置宽高<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title></title> <styletype......
  • Codeforces Round 987 (Div. 2)
    好不容易的一次CF阳间赛,这次题目普遍较长。A-PenchickandModernMonument题目大意将一个非递增的序列通过操作某些数(可增大可减小),最终使得序列变成一个非递减的序列,求出最少要操作多少次?解题思路这个题也是想了不断时间,而且还提交错误一次,原因就是调试的代码没......
  • Codeforces Round 987 (Div. 2)
    训练记录CodeforcesRound987(Div.2)4/6前四题都是简单思维题A.PenchickandModernMonument这个题目最贪心的做法是找到出现最多的数,保留种数字不变,其他按照题目要求改大小就行//Problem:A.PenchickandModernMonument//Contest:Codeforces-CodeforcesRound......
  • CF987 Div2 F 题解
    阶段1考虑我们每次随机删除两个然后询问,若中位数为\(\frac{n}{2},\frac{n}{2}+1\)称被删除的两个为基准数,用\(v_1,v_2\)代表。每次询问得到解的概率约为\(\frac{1}{2}\)。发现基准数一定一个\(<\frac{n}{2}\)一个\(>\frac{n}{2}+1\),且对于一次四个数的询问\(x......
  • C. Penchick and BBQ Buns (python解)-codeforces
    C.PenchickandBBQBuns(python解)-codeforces原题链接:点击传送问题分析:我们需要为给定数量的BBQ包子分配填料,满足以下条件:每种填料必须至少使用两次,或者不使用。任何两个相同填料的包子之间的距离必须是一个完全平方数。思路:为了满足条件,我们可以利用完全平方数的......
  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • Codeforces Round 987 (Div. 2)
    CodeforcesRound987(Div.2)总结A常见的套路,将一个序列变为不下降序列所需要改变的值的最小数量,考虑最大能保留多少个,显然是求最长上升子序列,而这题给出的\(a\)序列保证不上升,所以只需要考虑相同长度的一段。#include<iostream>#include<cstdio>#include<cstring>#......
  • Codeforces Round 983 (div 2)
    A.CircuitAlicehasjustcraftedacircuitwith\(n\)lightsand\(2n\)switches.Eachcomponent(alightoraswitch)hastwostates:onoroff.Thelightsandswitchesarearrangedinawaythat:Eachlightisconnectedtoexactlytwoswitches.Ea......
  • Solution - Codeforces 2031F Penchick and Even Medians
    飞快秒掉了,没报名痛失首杀,痛苦。简略题解:考虑先随机二元下标\((x_0,y_0)\)满足删去\((x_0,y_0)\)后查询的中位数还是\(\frac{n}{2},\frac{n}{2}+1\),那么这就说明\(p_{x_0},p_{y_0}\)一定在中位数的两边。那么还剩下的\(n-2\)个下标两两配对成\(\frac{n-2}{......