Codeforces Round #206 (Div. 2)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值