Codeforces Global Round 3

A-水题,a+b组合+ab+剩余的放头或者尾...注意long long

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
  long long a,b,c;
  while(~scanf("%lld%lld%lld",&a,&b,&c)){
     if (a==b){
        printf("%lld\n",2*c+2*b);
     }else {
       printf("%lld\n",2*c+2*min(a,b)+1);
     }

  }
  return 0;
}
View Code

B. Born This Way*

当时怎么也没想出来。。。
因为题目是按顺序给的,多半是二分。
当时的确想到二分,但是没有想好改如何二分
正确做法应该是枚举A->B航班的取消个数
要取消A->B航班的最好效果是把前i(枚举个数)个删除,
那么二分的去找第一个大于等于A->B航班的第i+1次航班的到达时间
如果还可以删除k-i个航班的话,从这个位置往后删除是最优的。
最后二分答案即可

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxx = 2e5+7;
int a[maxx];
int b[maxx];
int main(){
  int n,m;
  int ta,tb,k;
  while(~scanf("%d%d%d%d%d",&n,&m,&ta,&tb,&k)){

    for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for (int i=1;i<=m;i++){
        scanf("%d",&b[i]);
    }
    int ans=0;
    if (k>=n || k>=m){
        printf("-1\n");
        continue;
    }
    for (int i=0;i<=k;i++){
        int pos=lower_bound(b+1,b+1+m,a[i+1]+ta)-b;
        pos+=(k-i);
        if (pos>m){
            printf("-1\n");
            return 0;
        }
        else {
            ans=max(ans,b[pos]+tb);
        }
    }
    printf("%d\n",ans);
  }
  return 0;
}
View Code

C. Crazy Diamond*

好题!!!可能是我太菜了。。。
给出乱序的1-N的数字
题目要求把现在位置进行排序,每次可以交换两个位置,这个两个位置差必须大于n/2
当时没有想到考虑|i-j|>=n/2
如果这个i是n/2的话,j只能是n
如果这个位置是n/2+1的话,j只能是1
那么就非常容易看出来了,我们应该从中间往两边的走,因为越靠近中间的位置,要求越高
记录每个数值i对应的位置pos[i]
给一个左指针L,右指针R,往两边扩展,1和n一定是最后进来的
那么对于左位置L来说,如果a[L]!=L那么pos[L]有三种位置
pos[L]在L的右边并且位置查大于n/2,pos[L]->L
pos[L]<L,代表要的位置在L的左边,pos[L]->n->L
pos[L]>L,并且位置差小于L/2,pos[L]->1->N->L
右边同理,vector+pair保存答案即可

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#define mp make_pair
#define pii pair<int,int>
using namespace std;
const int maxx = 3e5+7;
int a[maxx];
int pos[maxx];
vector<pii>ans;
void change(int x,int y){
   ans.push_back(mp(x,y));
   swap(pos[a[x]],pos[a[y]]);
   swap(a[x],a[y]);
}
int main(){
  int n;
  while(~scanf("%d",&n)){
    for (int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        pos[a[i]]=i;
    }
    for (int i=n/2;i>=1;i--){
        int l=i,tmp;
        int r=n-i+1;
        if (a[l]!=l){
            if (pos[l]-l>=n/2){
              change(l,pos[l]);
            }else {
              if (pos[l]<l){
                change(pos[l],n);
                change(n,l);
              }else {
                change(pos[l],1);
                change(1,n);
                change(n,l);
              }
            }
        }
        if (a[r]!=r){
            if (r-pos[r]>=n/2){
                change(r,pos[r]);
            }else {
              if (pos[r]>r){
                change(pos[r],1);
                change(1,r);
              }else {
                change(pos[r],n);
                change(n,1);
                change(1,r);
              }
            }
        }
    }
    printf("%d\n",ans.size());
    for (int i=0;i<ans.size();i++){
        printf("%d %d\n",ans[i].first,ans[i].second);
    }
  }
  return 0;
}
View Code

 

全部评论

相关推荐

09-30 20:49
湖南工学院 Java
SP小夜:举报了哥,你什么都没做错,全怪我那令人作呕的嫉妒和卑微的自尊心,看见你的文字我完全破防了,我直接丢盔弃甲了,看见你这图的那一秒,我满头大汗,浑身发冷,亿郁症瞬间发作了,生活仿佛没了颜色,像是被抓住尾巴的赛亚人,带着海楼石的能力者,抽离尾兽的人柱力,像是没了光的奥特曼,彻底断绝了生的希望。我几乎都快羡慕得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。每天早上7点起床晚上9点睡觉,年复一年地学到现在,憧憬着一个月赚上万块的幸福生活,憧憬着美好阳光的未来。我打开了手机,看到你的图,我感到了深深的差距,我直接跳进了家门口的井里。
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务