Codeforces Round #364 (Div. 2)

A. Cards


題意:給n張牌,n一定爲偶數,n/2個人抽兩張牌,使得每個人抽的牌的數字之和都相同.題目保證一定有解.輸出每個人抽的兩張牌的編號.

思路:因爲一定有解,按照牌的數字sort一下即可.

#include<bits/stdc++.h>
using namespace std;
pair<int,int>card[105];
int main(){
  int n;
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%d",&card[i].first);
    card[i].second=i+1;
  }
  sort(card,card+n);
  for(int i=0;i<n/2;i++){
    printf("%d %d\n",card[i].second,card[n-1-i].second);
  }
}

B. Cells Not Under Attack


題意:看原題上的Note比較清楚.

思路:將需要消除的row,column記錄一下即可,若是未記錄的就減1,最後將剩下的row和column數相乘.

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int vx[1000005],vy[1000005];
int main(){
  int n,m,x,y;
  LL r,c;
  scanf("%d%d",&n,&m);
  r=n,c=n;
  while(m--){
    scanf("%d%d",&x,&y);
    if(!vx[x]&&!vy[y]){
      r--;
      c--;
    }
    else if(!vx[x]&&vy[y]){
      c--;
    }
    else if(vx[x]&&!vy[y]){
      r--;
    }
    vx[x]++,vy[y]++;
    printf("%I64d\n",r*c);
  }
}



C. They Are Everywhere

題意:給你長度爲n的字符串,求含最多不同字母的連續最小子區間.

思路:two-pointer.O(n)的複雜度.

#include<bits/stdc++.h>
using namespace std;
char s[100005];
map<char,int>V;
int main(){
  int n,l=0,r=0,sum=0,ans=0x3f3f3f;
  scanf("%d",&n);
  scanf("%s",s);
  for(int i=0;i<n;i++){
    if(!V[s[i]]){
      sum++;
      V[s[i]]++;
    }
  }
  V.clear();
  while(l<n){
    while(V.size()<sum&&r<n){
      V[s[r++]]++;
    }
    if(V.size()>=sum)ans=min(ans,r-l);
    V[s[l]]--;
    if(!V[s[l]])V.erase(s[l]);
    l++;
  }
  printf("%d\n",ans);

}


D. As Fast As Possible

題意:長度爲l的一條路,學校太窮,只有一輛車.而且只能載k個人而且每個學生只能做一次車,速度爲v2,總共有n個人,步行速度爲v1,求所有人走完路所用最短時間.

思路:推公式,一開始誤解以爲車必須到達目的,所以sample2無法解釋.車可以停在路上某一位置,然後在回去接人,再將車開到之前一個人走到的位置,再回去接人.直至所有人都到達目的地.

1.最後一個學生到達目的地的時間和最後一趟車到達目的地的時間相同.

2.先模擬車第一次送人的過程.假設車停在某一位置,距離開始位置爲d,然後回去再接人的距離爲(v2-v1)/(v2+v1)*d.記爲d1

3.根據公式d*ceil(n/k)-d1*(ceil(n/k)-1)=l.因爲車前進的距離爲d*ceil(n/k),車回去接人的距離爲d1*(ceil(n/k)-1).

相減則爲路長的距離l.

4.d1用d表示,求出d,那麼最後的答案就是d/v2+(l-d)/v1;

#include<bits/stdc++.h>
using namespace std;
int main(){
  double n,v1,v2,l,k,t;
  scanf("%lf%lf%lf%lf%lf",&n,&l,&v1,&v2,&k);
  t=ceil(n*1.0/k);
  printf("%.10f\n",l/v2*(v1+v2*(2*t-1))/(v1*(2*t-1)+v2));
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章