首页 > 其他分享 >Codeforces Round 973 (Div.2) A-E题解

Codeforces Round 973 (Div.2) A-E题解

时间:2024-09-23 15:51:31浏览次数:10  
标签:Showball 973 cout int 题解 LL lo Div.2 define

Codeforces Round 973 (Div.2) A-E题解

比赛传送门

A. Zhan's Blender 数学

显然答案为 \(\lceil \frac{n}{min(x,y)} \rceil\)。

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;

void Showball(){
   int n,x,y;
   cin>>n>>x>>y;
   int t=min(x,y);
   cout<<(n+t-1)/t<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

B. Battle for Survive 贪心

最后的赢家一定是最后一个格斗士,因此我们只需要让倒数第二名的等级越低越好,因此只需要让其余格斗士和倒数第二个格斗士都战斗一次,并且被淘汰即可。所以答案为:

\(a[n-1]-(a[n-2]-(sum-a[n-2]-a[n-1]))\)。可自行化简。

void Showball(){
   int n;
   cin>>n;
   vector<int> a(n);
   LL sum=0;
   for(int i=0;i<n;i++){
      cin>>a[i];
      sum+=a[i];
   }
   cout<<a[n-1]-(a[n-2]-(sum-a[n-2]-a[n-1]))<<endl;
}

C. Password Cracking 交互题

每次往我们目前猜的字符串后面接一个字符“0“或”1“ ,询问是否是原串的子串,直到两者都不是子串时,说明我们已经找到了原字符串的一个后缀串。接着我们只需要往前添加字符即可,如果不是”0“ 就直接添加”0“,这样查询次数不超过 \(2\times n\) 次。

void Showball(){
   int n;
   cin>>n;
   auto ask=[&](string s){
      cout<<"? "<<s<<endl;
      int ret;
      cin>>ret;
      return ret;
   };
 
   auto print=[&](string s){
      cout<<"! "<<s<<endl;
   };
 
   string t="";
   while((int)t.size()<n){
      if(ask(t+"0")){
         t+="0";
      }else if(ask(t+"1")){
         t+="1";
      }else break;
   }
 
   while((int)t.size()<n){
      if(ask("0"+t)){
         t="0"+t;
      }else t="1"+t;
   }
   
   print(t);
}

D. Minimize the Difference 二分

操作相当于我们可以将前面的数分给后面,操作后的数组一定是单调不减的。就极差最小值。因此我们可以二分最大值最小和最小值最大。至于 \(check\) 函数,以查找最小值为例,遇到比最小值大的,就可以留着分给后续的数。对于小于最小值的,如果可以补充就补充,否则就直接 \(return\) \(false\)。

void Showball(){
   int n;
   cin>>n;
   vector<LL> a(n);
   for(int i=0;i<n;i++) cin>>a[i];
 
   auto check=[&](LL x){
      LL cur=0;
      for(int i=0;i<n;i++){
         if(a[i]>x) cur+=a[i]-x;
         else{
            if(x-a[i]>cur) return false;
            cur-=x-a[i];
         }
      }
      return true;
   };
 
   auto check2=[&](LL x){
      LL cur=0;
      for(int i=0;i<n;i++){
         if(a[i]>x) cur+=a[i]-x;
         if(a[i]<x) cur-=x-a[i],cur=max(cur,0LL);
      }
      return cur<=0;
   };
 
   LL lo=0,hi=1e12,maxn=0,minn=0;
   while(lo<hi){
      LL mid=(lo+hi+1)>>1;
      if(check(mid)) lo=mid;
      else hi=mid-1;
   }
   minn=lo;
   lo=0,hi=1e12;
   while(lo<hi){
      LL mid=lo+hi>>1;
      if(check2(mid)) hi=mid;
      else lo=mid+1;
   }
   maxn=lo;
   cout<<maxn-minn<<endl;
}

E. Prefix GCD 思维+枚举+贪心

有一个性质:前缀\(gcd\) 最多 \(log\) 次就会变成 \(1\)。

因此,我们可以贪心的选择最小的前缀 \(gcd\),如果 \(gcd==1\) 时,后面的顺序就不重要了。直接算贡献即可。

首先可以把所有数除去 \(gcd\) ,最后结果再乘回去即可。

void Showball(){
   int n;
   cin>>n;
   vector<int> a(n);
   int g=0;
   for(int i=0;i<n;i++){
      cin>>a[i];
      g=__gcd(g,a[i]);
   }
   for(int i=0;i<n;i++) a[i]/=g;
 
   LL ans=0;
   int cur=0;
   for(int i=0;i<n;i++){
      int minn=inf;
      for(int j=0;j<n;j++) minn=min(minn,__gcd(cur,a[j]));
      cur=minn;
      ans+=cur;
      if(cur==1){
         ans+=n-i-1;
         break;
      }
   }
   cout<<ans*g<<endl;
}

标签:Showball,973,cout,int,题解,LL,lo,Div.2,define
From: https://www.cnblogs.com/showball/p/18427174

相关文章

  • 题解:AT_abc372_e [ABC372E] K-th Largest Connected Components
    题意给出\(q\)个操作。将\(u\)和\(v\)连边。问\(u\)所在的连通块中编号第\(k\)大的点。思路连通块很容易想到并查集,求第\(k\)大可以用平衡树(虽然赛时没看到\(k\le10\)),合并时将信息从将小的连通块合并到大的连通块,这样可以减少时间复杂度。什么?你不会写平衡......
  • 题解:AT_arc184_a [ARC184A] Appraiser
    题意\(1000\)个硬币中有\(10\)个假币,你每次可以询问两个位置的硬币类型是否相同,你需要用不超过\(950\)次询问找出所有假币的位置。思路将前\(990\)个硬币每\(11\)个分一组,共\(90\)组,余\(10\)个单独分一组。询问每组第\(1\)个硬币和这组后面硬币的关系。因为只......
  • CF1270H Number of Components 题解
    Description给一个长度为\(n\)的数组\(a\),\(a\)中的元素两两不同。对于每个数对\((i,j)(i<j)\),若\(a_i<a_j\),则让\(i\)向\(j\)连一条边。求图中连通块个数。支持\(q\)次修改数组某个位置的值,每次修改后输出图中连通块个数。\(n,q\le5\times10^5,1\lea_i\le10^......
  • 2024ICPC网络赛第二场题解(部分)
    前言这场相对作用大一点,最后顶着队友的怀疑压力乱搞出了C,但是后面看题解发现似乎是数据弱了跑过去,其实复杂度是队友分析的那样,是不正确的,但是毕竟是打名额的比赛,过了就是过了,这里分享一下C题的乱搞做法,以及其他题的我们队赛时代码。下面的顺序按过题顺序(也差不多是难度递增顺序)......
  • 网站程序打不开数据库错误等常见问题解决方法
    当遇到网站打不开或者数据库错误等问题时,可以按照以下步骤来诊断并解决问题:检查网站根目录:如果上传数据后显示“主机开设成功!”或“恭喜,lanmp安装成功!”,这通常是因为服务器默认放置了一个index.htm文件。此时应检查wwwroot目录内是否有自己的程序文件,并考虑删除默认的index.h......
  • 题解:AT_arc184_a [ARC184A] Appraiser
    本质上还是官方题解的分组并利用\(M\)不大的思路。询问次数\(Q\)离最简单的每个扫一遍就可以知道答案的做法少了\(50\)次。我们考虑如何减少这个次数。首先你可以发现一次询问可以覆盖到两个数,也就是说所有的数都被覆盖时只需要询问\(500\)次。我们考虑把不同的对拉出......
  • 网站打不开数据库错误等常见问题解决方法
    当遇到网站打不开且出现数据库错误等问题时,可以采取以下步骤进行排查和解决:检查默认页面:如果网站显示“主机开设成功!”或者“恭喜,lanmp安装成功!”这样的信息,这可能是服务器默认放置的页面。检查wwwroot目录下是否有自己的程序文件,如果没有,上传正确的文件,并删除默认的index.ht......
  • [ABC371F] Takahashi in Narrow Road 题解
    洛谷题目链接Atcoder题目链接前言这道题我赛时想到了正解并打了出来,然后因为把\(l\)打成了\(1\)导致WA\(\times23\),然后又没场切六道题(悲。然后赛后有人说正解是珂朵莉树/线段树,然而我是珂朵莉树\(+\)线段树,呵。题意数轴上有\(n\)个人,第\(i\)个人初始在\(X_i\)处,每一次操作......
  • CF1239E Turtle 题解
    Description一只乌龟从\(2\timesn\)的棋盘的左上角走到右下角,只能往下或往右,需要给出一种方案来分配\(2n\)个数字使得乌龟走过的路径上的数之和的最大值最小。\(2\leqn\leq25,0\leqa_{1,i},a_{2,i}\leq5\times10^4\)。Solution设\(pre_{i}=\sum_{j=1}^{i}{a_{1,i}......
  • P5975 photo 题解
    Solution先离散化,记\(f(l,r,p)\)为覆盖了\([l,r]\)区间内纵坐标\(\gep\)的点最少矩形个数。则:\[f(l,r,p)=\min(f(l,r,p),f(l,mid,p)+f(mid+1,r,p))\]\[f(l,r,p)=\min(f(l,r,p),f(l,r,res)+1)\]令\(h\)为用面积为\(S\)的矩形去覆盖\([l,r]\)区间的高度,即\(S/(r......