洛谷题单入门部分[python]

题单链接:https://www.luogu.com.cn/training/9349

Part 1.1 从零开始

语言基础题。

0b6d7bcc84d545b89e01196824c87b83.png

思路

让元和角成整数即可

比如一元五=15

题解

a,b=map(int,input().split())
c=10*a+b
print(c//19)

ed7ecba11e1944f29ad1e3e379ce3c0e.png

思路

因为只卖一种铅笔,就很简单了。把各个铅笔售卖方案单独遍历一遍,最后比较结果就可以

题解

import math
n=int(input())
p=[None]*3
p[0]=list(map(int,input().split()))
p[1]=list(map(int,input().split()))
p[2]=list(map(int,input().split()))


ans=float('inf')  # 初始化为无穷大
for i in range(3): 
    res=math.ceil(n/p[i][0])* p[i][1]
    ans=min(ans,res)
print(ans)

f9ead029efce424997e733d72f5e1c2f.png

思路

定义三个数组

每个月 手里存下来的、 上交给妈妈的、 以及自己的花销

题解

import sys
month_save=[0]*13
month_mom=[0]*13
month_pay=[0]*13
#initialzation
#1 start 12 end, belong to [)
for i in range(1,13):
    month_pay[i]=int(input())

for i in range(1,13):
    if i==1:
        month_save[1]=300-month_pay[1]
        if month_save[1]//100>=1:
            month_mom[1]=(month_save[1]//100)*100
            month_save[1]=(month_save[1]%100)
        continue
    month_save[i]=month_save[i-1]+300-month_pay[i]
    if month_save[i]<0:
        print(-i)
        break
    if month_save[i]//100>=1:
        month_mom[i]=(month_save[i]//100)*100+month_mom[i-1]#first give mom then upadate save
        month_save[i]=(month_save[i]%100)
        

    else:#need think more detalis ,and neglect :
        month_mom[i]=month_mom[i-1]
else:
    print(month_save[12]+int(1.2* month_mom[12]))

 

思路

内卷的小孩子

输入的每一行 加起来就是他今天上课的总时长,总时长>8 会不高兴

题解

max_mood = 0
day = 0

for i in range(1, 8):
    t = list(map(int, input().split()))
    a = t[0] + t[1]
    if a > 8:
        if a > max_mood:
            max_mood = a
            day = i

print(day)

思路

从1遍历到很大的数,中间发现Sn>k停下来就好了

题解

k=int(input())
s=0
for n in range(1,1000000):
    s+=1/n
    if s>k :
        print(n)
        break

思路

for i in (1,n+1):

        i%10 看各位是不是x

        然后i 再//10

 

or 直接转化成字符串用count统计

for i in (1,n+1):

       str(i).count( str(x))

题解

n,x= map(int,input().split())

t=0
for i in range(1, n + 1):
   t+=str(i).count(str(x))
print(t)

 按图中这样走线,n=7时候 走到了1/4

思路

观察图中走线,发现把这样走线方式看成一行一行

6f77a16a502a4561832f2a2f710acbec.png

那么就是1,2,3,4

到这里  再和题目中的7关联,发现 1+2+3<7<1+2+3+4 。

再看7刚好在第四根绿条上,这样我们就找到一个规律。

如果1+..+k<n<=1+..k+k+1  k>=2 ,那么第n个数一定在k+1条绿线上

而 n-(1+2+..+k)刚好等于  第n个数在这绿线上 第几个位置

 再观察这绿线上有什么特点,是不是第一个位置是1/k+1, 然后2/k  ... 到k+1/1

915ba340c9e9475891a340704be8d01f.png

这样我们就知道这道题规律了,先看n在哪一行(比如k+1行)

然后看n在k+1行位置x,x=n-(1+2+..+k)。那么结果就是x/k+2-x

同时还要注意奇数行,如第三行,那么结果是k+2-x/x  。是反着来的

题解

n = int(input())
s = 0
for i in range(1, 1000000):
    s += i
    if n <= s:
        k = i
        pos = n - (s - i)
        break
if k % 2 == 0:
    print(f"{pos}/{k + 1 - pos}")
else:
    print(f"{k + 1 - pos}/{pos}")

思路

is_neg=n<0  记录是不是负数

res+=按个把个位取得 ,再对之前的取得的结果*10

n//10  不断以10的倍率缩减

题解

import math
n=int(input())
res=0
if n!=0:
    is_neg=n<0# push ahead
    n=abs(n)
    while n!=0:
        res=res*10+n%10
        n//=10
    
    if is_neg:
        print(-res)
    else:
        print(res)
else:
    print(0)
        

Part 1.2 数组基础

Part 1.3 字符串基础

  • P5015 标题统计
  • s=str(input())
    
    c=s.split()
    sum=0
    
    for a in c:
        for b in a:
            sum+=1
    print(sum)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值