Codeforces Round #206 (Div. 2)

来源:互联网 发布:微博旅游博主数据统计 编辑:程序博客网 时间:2024/04/27 14:38

CodeForces 355A


题意:S(n)为n各个位上的和,dr(n)为n的根。

  1. dr(n) = S(n), ifS(n) < 10;
  2. dr(n) = dr( S(n) ), ifS(n) ≥ 10.

给定k和d,k为n的位数,d为dr(n)。请你给出一个符合情况的n。


思路:因为d是根,肯定小于10,所以将d作为n的第一位,后面跟上k-1个0即可。需要特判d=0的情况,d=0时n只能为0


/*************************************************************************     File Name: A.cpp     ID: obsoles1     PROG:      LANG: C++      Mail: 384099319@qq.com      Created Time: 2016年07月19日 星期二 09时01分15秒 ************************************************************************/#include<bits/stdc++.h>#define Max(x,y) ((x)>(y)?(x):(y))#define Min(x,y) ((x)<(y)?(x):(y))#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();++it)#define Abs(x,y) ((x)>(y)?((x)-(y)):((y)-(x)))#define ll long long#define Mem0(x) memset(x,0,sizeof(x))#define Mem1(x) memset(x,-1,sizeof(x))#define MemX(x) memset(x,0x3f,sizeof(x))#define pb push_backusing namespace std;int main(){  int k,d;  while(~scanf("%d%d",&k,&d)){    if(!d && k>1)puts("No solution");    else{      printf("%d",d);      k--;      while(k--)printf("0");      puts("");    }  }}



CodeForces 355B


题意:四种票,c1是可以坐一种bus或trolley一次,c2是可以坐一种bus或trolley无限次,c3是可以坐所有bus或者所有trolley无限次,c4是可以坐所有bus和trolley无限次。给定c1,c2,c3,c4以及分别乘坐n种bus和m种trolley的次数,问怎么买票最便宜。


思路:每种c1和c2比,相加后和c3比,bus和trolley相加后和c4比,得出最小值。


/*************************************************************************     File Name: B.cpp     ID: obsoles1     PROG:      LANG: C++      Mail: 384099319@qq.com      Created Time: 2016年07月19日 星期二 09时10分33秒 ************************************************************************/#include<bits/stdc++.h>#define Max(x,y) ((x)>(y)?(x):(y))#define Min(x,y) ((x)<(y)?(x):(y))#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();++it)#define Abs(x,y) ((x)>(y)?((x)-(y)):((y)-(x)))#define ll long long#define Mem0(x) memset(x,0,sizeof(x))#define Mem1(x) memset(x,-1,sizeof(x))#define MemX(x) memset(x,0x3f,sizeof(x))#define pb push_backusing namespace std;int main(){  int n,m,c1,c2,c3,c4,i,x,ans,tmp;  while(~scanf("%d%d%d%d%d%d",&c1,&c2,&c3,&c4,&n,&m)){    ans=tmp=0;    for(i=0;i<n;++i){      scanf("%d",&x);      tmp+=Min(x*c1,c2);    }    tmp=Min(tmp,c3);    for(i=0;i<m;++i){      scanf("%d",&x);      ans+=Min(x*c1,c2);    }    ans=Min(ans,c3);    ans=Min(ans+tmp,c4);    printf("%d\n",ans);  }}



CodeForces 355C


题意:给你一排n个物品,机器人去取,只能在端点取,从左取的花费是l,从右取是r。
如果连续从左取,附加花费是ql,连续从右取,附加花费是qr。问取完的最小花费。


思路:无论怎么取左边从左取和右边从右取都会有一条交线,我们枚举这条交线算出花费,枚举求出最小花费。显然的,左右交替取比连续取的花费要小。所以在确定交线之后优先左右交替取,直到只剩下一边再连续取。


/*************************************************************************     File Name: C.cpp     ID: obsoles1     PROG:      LANG: C++      Mail: 384099319@qq.com      Created Time: 2016年07月19日 星期二 10时27分32秒 ************************************************************************/#include<bits/stdc++.h>#define Max(x,y) ((x)>(y)?(x):(y))#define Min(x,y) ((x)<(y)?(x):(y))#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();++it)#define Abs(x,y) ((x)>(y)?((x)-(y)):((y)-(x)))#define ll long long#define Mem0(x) memset(x,0,sizeof(x))#define Mem1(x) memset(x,-1,sizeof(x))#define MemX(x) memset(x,0x3f,sizeof(x))#define pb push_backusing namespace std;const int N=1e5+10,INF=0x3f3f3f3f;int w[N],pre[N];int main(){  int n,l,r,ql,qr,i;  while(~scanf("%d%d%d%d%d",&n,&l,&r,&ql,&qr)){    pre[0]=0;    for(i=1;i<=n;++i){      scanf("%d",w+i);      pre[i]=pre[i-1]+w[i];    }    int minn=INF,tmp;    for(i=0;i<=n;++i){      tmp=pre[i]*l+(pre[n]-pre[i])*r;      //cout<<"tmp="<<tmp<<endl;      if(n-2*i>1)tmp+=(n-2*i-1)*qr;      else if(n-2*i<-1)tmp+=(2*i-n-1)*ql;      //cout<<"tmp="<<tmp<<endl;      minn=Min(minn,tmp);    }    printf("%d\n",minn);  }}



CodeForces 355D




CodeForces 355E


题意:求n个数的最大公约数,这n个数可以最大减k。


思路:设该最大公约数为d,a%d<=k  令m=min{ai},若ai%m<=k,则m-1<=k,m<=k+1.

即m<=k+1时,m即为所要找的d。

m>k+1时,ai%m>k,又有ai%d<=d-1,所以k+1是最小的肯定符合情况的数,所以d在区间[k+1,m)中找。

暴力时间复杂度为O(n*k),会T

不去考虑ai%d是不是小于等于k,而是反过来考虑ai在不在范围区间里,[d,d+k],[2d,2d+k]......[xd,xd+k].  (xd+k<=max{ai}+d)

时间复杂度为O(k*logn)


/*************************************************************************     File Name: E.cpp     ID: obsoles1     PROG:      LANG: C++      Mail: 384099319@qq.com      Created Time: 2016年07月19日 星期二 10时45分20秒 ************************************************************************/#include<bits/stdc++.h>#define Max(x,y) ((x)>(y)?(x):(y))#define Min(x,y) ((x)<(y)?(x):(y))#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();++it)#define Abs(x,y) ((x)>(y)?((x)-(y)):((y)-(x)))#define ll long long#define Mem0(x) memset(x,0,sizeof(x))#define Mem1(x) memset(x,-1,sizeof(x))#define MemX(x) memset(x,0x3f,sizeof(x))#define pb push_backusing namespace std;const int N=300010,INF=0x3f3f3f3f;int a[N];int main(){  int n,k,i,j,pos1,pos2;  while(~scanf("%d%d",&n,&k)){    for(i=0;i<n;++i)      scanf("%d",a+i);    sort(a,a+n);    if(a[0]<=k+1){      printf("%d\n",a[0]);      continue;    }    for(i=a[0];i>k;--i){      int cnt=0;      for(j=1;j*i+k<=a[n-1]+i;++j){        pos1=lower_bound(a,a+n,j*i)-a;        pos2=lower_bound(a,a+n,j*i+k+1)-a;        cnt+=pos2-pos1;      }      if(cnt==n)break;    }    printf("%d\n",i);  }}

0 0
原创粉丝点击