纪念品分组 w = int(input()) n = int(input()) p = [in
纪念品分组
w = int(input())
n = int(input())
p = [int(input()) for _ in range(n)]
p.sort()
l, r, res = 0, n-1, 0
while l <= r:
if p[l] + p[r] <= w:
l += 1
r -= 1
res += 1
print(res)
采药
T, M = map(int, input().split())
dp = [0]*(T+1)
for _ in range(M):
t, v = map(int, input().split())
for j in range(T, t-1, -1):
dp[j] = max(dp[j], dp[j-t]+v)
print(dp[T])
合并果子
import heapq
n = int(input())
a = list(map(int, input().split()))
heapq.heapify(a)
res = 0
while len(a) > 1:
x = heapq.heappop(a)
y = heapq.heappop(a)
res += x + y
heapq.heappush(a, x + y)
print(res)
开心的金明
n, m = map(int, input().split())
dp = [0]*(n+1)
for _ in range(m):
v, p = map(int, input().split())
val = v * p
for j in range(n, v-1, -1):
dp[j] = max(dp[j], dp[j-v] + val)
print(dp[n])
能量项链
n=int(input())
a=list(map(int,input().split()))[:n]*2
dp=[[0]*(2*n) for _ in range(2*n)]
for l in range(2,n+1):
for i in range(2*n-l):
j=i+l
for k in range(i+1,j):
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j])
print(max(dp[i][i+n] for i in range(n)))
装箱
V=int(input())
n=int(input())
dp=[0 for i in range(V+1)]
for i in range(n):
v=int(input())
for j in range(V,v-1,-1):
dp[j]=max(dp[j],dp[j-v]+v)
print(V-dp[V])
一元三次方程求解
a,b,c,d=map(float,input().split())
x=-100.0
while x <=100.0:
val=a*x**3+b*x**2+c*x+d
if abs(val)<=1e-5:
print(f"{x:.2f}",end=" ")
x+=0.5
x+=0.001
选数
from itertools import combinations
n,k=map(int,input().split())
x=list(map(int,input().split()))
r=0
for comb in combinations(x,k):
s=sum(comb)
if s>1 and all(s%i for i in range(2,int(s**0.5)+1)):
r+=1
print(r)
2的n次方
a=int(input())
print(2**a)
混合牛奶
n, m = map(int, input().split())
v = sorted(tuple(map(int, input().split())) for _ in range(m))
s = 0
for p, a in v:
t = min(n, a)
s += t * p
n -= t
print(s)
数列分段n,m=map(int,input().split())
a=list(map(int,input().split()))
group=1
sum=0
for i in a:
sum+=i
if sum>m:
group+=1
sum=i
print(group)
石子合并
n=int(input())
a=list(map(int,input().split()))
a*=2
s=[0]*(n*2+1)
for i in range(n*2):s[i+1]=s[i]+a[i]
mn=[[0]*(n*2) for _ in range(n*2)]
mx=[[0]*(n*2) for _ in range(n*2)]
for l in range(1,n):
for i in range(n*2-l):
j=i+l;t=s[j+1]-s[i]
mn[i][j]=min(mn[i][k]+mn[k+1][j]+t for k in range(i,j))
mx[i][j]=max(mx[i][k]+mx[k+1][j]+t for k in range(i,j))
print(min(mn[i][i+n-1] for i in range(n)))
print(max(mx[i][i+n-1] for i in range(n)))
田忌赛马
import sys
d=list(map(int,sys.stdin.read().split()))
n,*r=d
t=sorted(r[:n],reverse=1)
q=sorted(r[n:],reverse=1)
i=j=x=y=s=0
y=n-1
while i<=x:
if t[i]>q[j]:s+=200;i+=1;j+=1
elif t[x]>q[y]:s+=200;x-=1;y-=1
else:s-=200*(t[x]<q[j]);x-=1;j+=1
print(s)
最长公共子序列
#include<bits/stdc++.h>
using namespace std;
const int M=5e3+5,mod=1e8;
int m,n,f[M][M],c[M][M];
string a,b;
int main(){
cin>>a>>b;
m=a.size()-1,n=b.size()-1;
a=' '+a,b=' '+b;
for(int i=0;i<=m;i++)c[i][0]=1;
for(int i=0;i<=n;i++)c[0][i]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1,c[i][j]=c[i-1][j-1];
else f[i][j]=max(f[i-1][j],f[i][j-1]);
if(f[i][j]==f[i-1][j])c[i][j]+=c[i-1][j];
if(f[i][j]==f[i][j-1])c[i][j]+=c[i][j-1];
if(f[i][j]==f[i-1][j-1])c[i][j]-=c[i-1][j-1];
c[i][j]%=mod;
}
}
cout<<f[m][n]<<'\n'<<c[m][n];
return 0;
}
斐波那契数列
n=int(input())
f=[1,1]
for i in range(2,30):f.append(f[i-1]+f[i-2])
for _ in range(n):print(f[int(input())-1])
全排列问题
import itertools as it
n=int(input())
for p in it.permutations(range(1,n+1)):print(''.join(f'{x:5d}'for x in p))
w = int(input())
n = int(input())
p = [int(input()) for _ in range(n)]
p.sort()
l, r, res = 0, n-1, 0
while l <= r:
if p[l] + p[r] <= w:
l += 1
r -= 1
res += 1
print(res)
采药
T, M = map(int, input().split())
dp = [0]*(T+1)
for _ in range(M):
t, v = map(int, input().split())
for j in range(T, t-1, -1):
dp[j] = max(dp[j], dp[j-t]+v)
print(dp[T])
合并果子
import heapq
n = int(input())
a = list(map(int, input().split()))
heapq.heapify(a)
res = 0
while len(a) > 1:
x = heapq.heappop(a)
y = heapq.heappop(a)
res += x + y
heapq.heappush(a, x + y)
print(res)
开心的金明
n, m = map(int, input().split())
dp = [0]*(n+1)
for _ in range(m):
v, p = map(int, input().split())
val = v * p
for j in range(n, v-1, -1):
dp[j] = max(dp[j], dp[j-v] + val)
print(dp[n])
能量项链
n=int(input())
a=list(map(int,input().split()))[:n]*2
dp=[[0]*(2*n) for _ in range(2*n)]
for l in range(2,n+1):
for i in range(2*n-l):
j=i+l
for k in range(i+1,j):
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j])
print(max(dp[i][i+n] for i in range(n)))
装箱
V=int(input())
n=int(input())
dp=[0 for i in range(V+1)]
for i in range(n):
v=int(input())
for j in range(V,v-1,-1):
dp[j]=max(dp[j],dp[j-v]+v)
print(V-dp[V])
一元三次方程求解
a,b,c,d=map(float,input().split())
x=-100.0
while x <=100.0:
val=a*x**3+b*x**2+c*x+d
if abs(val)<=1e-5:
print(f"{x:.2f}",end=" ")
x+=0.5
x+=0.001
选数
from itertools import combinations
n,k=map(int,input().split())
x=list(map(int,input().split()))
r=0
for comb in combinations(x,k):
s=sum(comb)
if s>1 and all(s%i for i in range(2,int(s**0.5)+1)):
r+=1
print(r)
2的n次方
a=int(input())
print(2**a)
混合牛奶
n, m = map(int, input().split())
v = sorted(tuple(map(int, input().split())) for _ in range(m))
s = 0
for p, a in v:
t = min(n, a)
s += t * p
n -= t
print(s)
数列分段n,m=map(int,input().split())
a=list(map(int,input().split()))
group=1
sum=0
for i in a:
sum+=i
if sum>m:
group+=1
sum=i
print(group)
石子合并
n=int(input())
a=list(map(int,input().split()))
a*=2
s=[0]*(n*2+1)
for i in range(n*2):s[i+1]=s[i]+a[i]
mn=[[0]*(n*2) for _ in range(n*2)]
mx=[[0]*(n*2) for _ in range(n*2)]
for l in range(1,n):
for i in range(n*2-l):
j=i+l;t=s[j+1]-s[i]
mn[i][j]=min(mn[i][k]+mn[k+1][j]+t for k in range(i,j))
mx[i][j]=max(mx[i][k]+mx[k+1][j]+t for k in range(i,j))
print(min(mn[i][i+n-1] for i in range(n)))
print(max(mx[i][i+n-1] for i in range(n)))
田忌赛马
import sys
d=list(map(int,sys.stdin.read().split()))
n,*r=d
t=sorted(r[:n],reverse=1)
q=sorted(r[n:],reverse=1)
i=j=x=y=s=0
y=n-1
while i<=x:
if t[i]>q[j]:s+=200;i+=1;j+=1
elif t[x]>q[y]:s+=200;x-=1;y-=1
else:s-=200*(t[x]<q[j]);x-=1;j+=1
print(s)
最长公共子序列
#include<bits/stdc++.h>
using namespace std;
const int M=5e3+5,mod=1e8;
int m,n,f[M][M],c[M][M];
string a,b;
int main(){
cin>>a>>b;
m=a.size()-1,n=b.size()-1;
a=' '+a,b=' '+b;
for(int i=0;i<=m;i++)c[i][0]=1;
for(int i=0;i<=n;i++)c[0][i]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1,c[i][j]=c[i-1][j-1];
else f[i][j]=max(f[i-1][j],f[i][j-1]);
if(f[i][j]==f[i-1][j])c[i][j]+=c[i-1][j];
if(f[i][j]==f[i][j-1])c[i][j]+=c[i][j-1];
if(f[i][j]==f[i-1][j-1])c[i][j]-=c[i-1][j-1];
c[i][j]%=mod;
}
}
cout<<f[m][n]<<'\n'<<c[m][n];
return 0;
}
斐波那契数列
n=int(input())
f=[1,1]
for i in range(2,30):f.append(f[i-1]+f[i-2])
for _ in range(n):print(f[int(input())-1])
全排列问题
import itertools as it
n=int(input())
for p in it.permutations(range(1,n+1)):print(''.join(f'{x:5d}'for x in p))
全部评论
相关推荐
点赞 评论 收藏
分享
11-26 10:52
广州理工学院 后端工程师 点赞 评论 收藏
分享
点赞 评论 收藏
分享