Codeforces Round 973 (Div. 2)

manbin發表於2024-09-27

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";
}

相關文章