华为复盘2

 

 

 python

from itertools import permutations

ipt = [[2,2,1],[2]]
life = ipt[0][0]
danger = ipt[1]
target = ipt[0][1]+1
start = target//3+1
end = target//1
nums = list(range(1,target+1))
resnum = 0
# print(nums)

res = []
def helper(i, tmp_sum, tmp):
    if tmp_sum > target or i == len(nums):
        return
    if tmp_sum == target:
        res.append(tmp)
        return
    helper(i,  tmp_sum + nums[i],tmp + [nums[i]])
    helper(i+1, tmp_sum ,tmp)
helper(0, 0, [])


for i in res:
    temp=[]
    for j in permutations(i, len(i)):
        if j == temp:
            continue
        temp = j
        if sum(j)==target:
            s=0
            k=0
            for h in j:
                s+=h
                if s==danger[k] and life>0:
                    if k<len(danger)-1:
                        k+=1
                    else:
                        break
                    life-=1
            if life>0:
                resnum+=1
                life = ipt[0][1]
print(resnum)

c++ 

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e2+10;
typedef long long ll;
int a[maxn];
ll dp[maxn][maxn];//走到i还剩下j滴血的方案;
int main()
{
 int n,m,k;scanf("%d %d %d",&m,&n,&k);
 for(int i =1;i<=k;++i)
 {
  int num=0;
  scanf("%d",&num);
  a[num] = 1;
 }//走到n+1位置;
 dp[0][m] = 1;
 ll res=0;
 for(int i =1;i<=n+1;++i)
 {
  for(int j=1;j<=m;++j)
  {
   dp[i][j] += dp[i-1][j+a[i] ];
   if(i-2>=0)dp[i][j] += dp[i-2][j+a[i] ];
   if(i-3>=0)dp[i][j] += dp[i-3][j+a[i] ];//三种走法
   if(i==n+1)res+=dp[i][j];
  }
 }
 cout<<res<<endl;
 return 0;
}

 

def _cmp(a, b):
    if a[0] < b[0]:
        return -1
    if a[0] > b[0]:
        return 1
    if a[0] == b[0]:
        return -1 if a[1] < b[1] else 1


if __name__ == '__main__':
    import functools
    import heapq
    m, n = map(int, input().split())
print(m+n)
    port = list(map(int, input().split()))
    size = list(map(int, input().split()))
    time = list(map(int, input().split()))
    port = sorted(port)
    st = [(size[i], time[i]) for i in range(m)]
    st = sorted(st, key=functools.cmp_to_key(_cmp), reverse=True)
    pheap = [(0, i) for i in range(n)]
    heapq.heapify(pheap)
    ans = 0
    for i in range(m):
        t_q = []
        while pheap:
            pt, idx = heapq.heappop(pheap)
            if port[idx] >= st[i][0]:
                heapq.heappush(pheap, (pt+st[i][1], idx))
                ans = max(ans, pt+st[i][1])
                break
            else:
                t_q.append((pt, idx))
        for item in t_q:
            heapq.heappush(pheap, item)
    print(ans)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值