题意:S(n)为n各个位上的和,dr(n)为n的根。
- dr(n) = S(n), ifS(n) < 10;
- 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("");
}
}
}
题意:四种票,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);
}
}
题意:给你一排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);
}
}
题意:求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);
}
}