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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值