题意:先打印L,再打印n个o,再打印ng
n=int(input())
print("L",end="")
for i in range(n):
print("o",end="")
print("ng")
题意:给一个数,将这个数转换为2进制,计算二进制结果后边有多少个0
用lowbit解决,lowbit 一下可以得到2进制数最后一位1的10进制数
n=int(input())
x=int(n&(-n))#lowbit
res=0
if x==1:
print(res)
else:
while x:
x//=2
res+=1
print(res-1)
补充一个bin()函数
n=int(input())
x=bin(n)#可以将10进制转为2进制 bin(8)=0b1000 前面会多一个0b
y=x[::-1]#逆序 bin(10)=0b1010
print(y.find('1'))
寻找第几个好的数,好的数定义为:每个数位上的数都为偶数
通过打表前20个好的数,可以发现,本质上是一个5进制的数,每5个数进一次位
下边是c++代码,比赛过程中,写完代码一直发现总是与标准答案多进了一位,调了很长时间
写的像依托答辩
#include
using namespace std;
#define int long long
int o[20];
int d[10]={0,2,4,6,8,8};
signed main()
{
o[1]=5;
for(int i=2;i<=19;i++)
{
o[i]=o[i-1]*5;
}
int n;
cin>>n;
int f=0;
int res=0;
int f1=0;
for(int i=18;i>=1;i--)
{
// cout<<"i=="<=0;i--)
{
if(str1[i]>='2')
{
str1[i]=str1[i]-2;
break;
}
else
{
str1[i]='8';
}
}
for(int i=0;i
下边是改进后的代码,发现上边的非常冗余,只需要n在最开始减1就行,因为要对5取余数,那么循环就应该是0~4,所以n应该减1
n=int(input())
d=[0,2,4,6,8]
x=5
a=[]
for i in range(18):
a.append(x)
x*=5
n-=1
f=0
#print(d[0],d[1])
for i in range(17,-1,-1):
y=int(n//a[i])
if y==0 and f==1:print("0",end="")
elif y>0:
print(d[y],end="")
f=1
n=int(n%a[i])
print(d[n])
题意:求最长的金字塔
可以执行一下操作:
令一个数减1,或者删除最前一个数,或者删除最后边一个数
维护一个从左到右的序列和一个从右到左的序列
金字塔的左半边:x[i]=min(x[i-1]+1,a[i])
左半边可以形成的条件是从左到右依次增加,且差值为1,最理性的是1,2,3,4,5,,,
此时需要考虑原序列的影响,假如在3的位置原序列为1,那么就只能再从1开始,那么4的位置是2,以此类推,所以推论就是 x[i]=min(x[i-1]+1,a[i])
即使最开始原序列为 5 6 7 8 3 2 1,那么我们总可以将前4个一直减1,得到1 2 3 4 3 2 1
同理右半边的推论为:y[i]=min(y[i+1]+1,a[i])
最终答案就是res=max(res,min(x[i],y[i]))
n=int(input())
a=list(map(int,input().split()))
x=[0 for i in range(n+1)]
y=[0 for i in range(n+2)]
for i in range(1,n+1):
x[i]=min(x[i-1]+1,a[i-1])
for i in range(n,0,-1):
y[i]=min(y[i+1]+1,a[i-1])
res=0
for i in range(1,n+1):
res=max(res,min(x[i],y[i]))
print(res)