Codeforces Round 973 (Div. 2)

Codeforces 973 div2

A:Zhan's Blender

点击查看代码
void solve() {
  int n,x,y;
  cin>>n>>x>>y;
  int ans=0;
  if(x>=y) {
    ans=n/y;
    if(n%y) ans++;
  }
  else {
    ans=n/x;
    if(n%x) ans++;
  }
  cout<<ans<<endl;
}

B:Battle for Servive

点击查看代码
void solve() {
  int n;cin>>n;
  int a[n+1]={};
  int sum=0;
  for(int i=1;i<=n;i++) {
    cin>>a[i];
    if(i<=n-2) sum+=a[i];
  }
  cout<<a[n]-a[n-1]+sum<<endl;
}

C:Password Cracking

交互题

点击查看代码
const int maxn=2e6+5;
int h[maxn];
int ask(string s){
    cout << "? " << s << endl;
    cout.flush();
    int x;
    cin >> x;
    return x;
  }

  void solve(){
    int n;
    cin >> n;
    string s;
    if ( ask("0") ) s = "0";
    else s = "1";
    while ( s.length() < n ){
      if ( ask(s + '0') ){
        s += '0';
      }else if ( ask(s + '1') ){
        s += '1';
      }else{
        break;
      }
    }
    while ( s.length() < n ){
      if ( ask('0' + s) ){
        s = '0' + s;
      }else{
        s = '1' + s;
      }
    }
    cout << "! " << s << endl;
    cout.flush();
}

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

D:Minimize the Difference

原理:本位只能变小,后继增大。如果数组为单调递增,那么a[n]-a[1]。如果单调递减,从前往后那么需要通过本位减,后继加取不同个step所选数组的平均值来维护最小值;从后往前需要通过本位加,前驱减取不同step所选数组的平均值来维护最大值。其中最大值,最小值结果为最优解的结果。补充:本题有向上取整的方法。

点击查看代码
const int N=2e5+10;
const i64 INF=0x3f3f3f3f3f3f3f;
i64 a[N];

void solve() {
  i64 n;cin>>n;
  i64 s=0,mi=INF,ma=-INF;
  for(i64 i=1;i<=n;i++) {
    cin>>a[i];
  }
  for(i64 i=1;i<=n;i++) {
    s+=a[i];
    mi=min(mi,s/i);
  }//从头开始不断求前缀序列的平均值,可能达到可能达不到。取平均值维护最小值
  s=0;
  for(i64 i=n;i>=1;i--) {
    s+=a[i];
    ma=max(ma,(s+n-i)/(n-i+1));//向上取整,平均值维护最大值:向上取整的方式需要记住!
  }
  cout<<ma-mi<<endl;
}

E:Prefix GCD

原理:相当于我创建了一个新数组,ans[i]存储原来最优排序后的前i位的GCD。此时先把整个数组的最大公约数除去,简便运算,避免超时。再对于ans数组一位一位去存储最优解,最优解则需要遍历原array,使得前缀gcd取得最小值,以此来维护ans数组。补充:_gcd(,)为algorithm自带函数,不需要编写gcd了。

点击查看代码
const ll N=2e5+5;
const ll mod=1e9+7;
ll a[N];
ll vis[N];

void solve() {
    ll n,cnt=0,p=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
      cin>>a[i];
      vis[i]=0;
    }
    vis[1]=1;
    ll id=1;
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
    {
      p=__gcd(p,a[i]);
    }
    ll ans=a[1],s=a[1],mi=a[1];
    while(1)
    {
      s=mi;
      ll t=0,cnt=0;
      for(int i=2;i<=n;i++)
      {
        if(vis[i])
        {
          continue;
        }
        t=__gcd(s,a[i]);
        if(t<=mi)
        {
          mi=t;
          id=i;
          cnt++;
        }
      }
      if(cnt)
      {
        vis[id]=1;
        ans+=mi;
      }
      else
      {
        break;
      }
      if(mi==p)
      {
        break;
      }
    }
    for(int i=1;i<=n;i++)
    {
      if(!vis[i])
      {
        ans+=p;
      }
    }
    cout<<ans<<"\n";
}
posted @   manbin  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示