Algorithmic Toolbox_Greedy Algorithm

Algorithmic Toolbox_Greedy Algorithm

一、What is Greedy Algorithm

Greedy algorithm means that when solving a problem we always make the best choice in the current view. However, greedy algorithm does not get the overall optimal solution to all problems, the key is the choice of greedy strategy. That is to say, without considering the overall optimality, what is made is only a local optimal solution in a certain sense.

二、Step of Greedy Algorithm

  1. Construct a judge function to make sure that each move is safe.
  2. Construct a function to check if the candidate object is an answer of the question.
  3. As the algorithm progresses, two other sets will be accumulated: one contains candidates that have been considered and selected, and the other contains candidates that have been considered but discarded .
  4. Just analyze these sets, then return the correct answer.

三、Seven Typical Answer to Help us Understanding

在这里插入图片描述

This is my code.

inp=int(input())
denomination=[1,5,10]
def plan(m):
    oup_1=m//denomination[2]
    m=m-oup_1*denomination[2]
    oup_2=m//denomination[1]
    oup_3=m-oup_2*denomination[1]
    return oup_1+oup_2+oup_3
print(plan(inp))

在这里插入图片描述

import sys
data = list(map(lambda x:int(x), sys.stdin.read().split()))
n,capacity=data[0:2]
values,weights = data[2:len(data)-1:2],data[3:len(data):2]
def most_cost(n,capacity,values,weights):
    ecv=[[values[i]/weights[i],weights[i]] for i in range(len(values))]
    ecv_cur=sorted(ecv,reverse=True)
    sum_w=sum([ecv_cur[i][1] for i in range(len(ecv))])
    if sum_w<=capacity:
        return sum([ecv_cur[i][0]*ecv_cur[i][1] for i in range(len(ecv))])
    else:
        sum_c,sum_w,i=0,0,0
        while True:
            if capacity<=sum_w:
                break
            else:
                sum_w += ecv_cur[i][1]
                i+=1
                continue
        sum_c=sum([ecv_cur[k][0]*ecv_cur[k][1] for k in range(i-1)])+ecv_cur[i-1][0]*(capacity+ecv_cur[i-1][1]-sum_w)
        return sum_c
print(round(most_cost(n,capacity,values,weights),4))

在这里插入图片描述

import sys
data = list(map(lambda x:int(x), sys.stdin.read().split()))
d,m,n,sta=data[0],data[1],data[2],data[3:]
sta_de=[sta[i+1]-sta[i] for i in range(n-1)]
sta_de.append(d-sta[len(sta)-1])
def st_times(d,m,n,sta):
    if m>d:
        return 0
    else:
        if m<max(sta_de):
            return -1
        else:
            st_t,a=0,0
            sta.append(d)
            for k in range(n+1):
                if m<sta[k]-a:
                    st_t+=1
                    a=sta[k-1]
                    if d-a<m:
                        break
            return st_t
print(st_times(d,m,n,sta))

在这里插入图片描述

import sys
data = list(map(lambda x:int(x), sys.stdin.read().split()))
tol=data[0]
id_click=data[1:int((len(data)+1)/2)]
id_profit=data[int((len(data)+1)/2):]
def income(tol,id_click,id_profit):
    id_c_sort=sorted(id_click,reverse=True)
    id_p_sort=sorted(id_profit,reverse=True)
    income_lst=sorted([id_c_sort[i]*id_p_sort[i] for i in range(len(id_c_sort))],reverse=True)
    return sum([income_lst[i] for i in range(tol)])
print(income(tol,id_click,id_profit))

在这里插入图片描述
在这里插入图片描述

import sys
data = list(map(lambda x:int(x), sys.stdin.read().split()))
n,lst_org=data[0],[[data[i],data[i+1]] for i in range(1,len(data),2)]
def mini_set(n,lst_org):
    answer,mid1,mid2,res=[],0,0,[]
    lst_deal2=sorted(lst_org,reverse=False,key=lambda i:i[1])
    # print(lst_deal2)
    i,j=0,0
    a,answer,b=lst_deal2[0][1],[],0
    while j<len(lst_deal2):
        if j==len(lst_deal2)-1:
            answer.append(lst_deal2[i][1])
        if lst_deal2[i][1]<lst_deal2[j][0]:
            answer.append(lst_deal2[i][1])
            i=j
            if j==len(lst_deal2)-1:
                answer.append(lst_deal2[i][1])
            j+=1
        else:
            j+=1
    return answer
ans=mini_set(n,lst_org)
ans=list(set(ans))
print(len(ans))
print(ans[0],end="")
for i in range(1,len(ans)):
    print(" "+str(ans[i]),end="")

在这里插入图片描述

import sys
import math
data = int(list(map(lambda x:int(x), sys.stdin.read().split()))[0])
def decline(data1):
    ans,i=[],0
    while True:
        data1=data1-i
        i+=1
        if i<data1/2:
            ans.append(i)
        else:
            ans.append(data1)
            break
    return ans
ans=decline(data)
print(len(ans))
print(ans[0],end="")
for i in range(1,len(ans)):
    print(" "+str(ans[i]),end="")

在这里插入图片描述
在这里插入图片描述

import sys
import copy
data = list(map(lambda x:str(x), sys.stdin.read().split()))
n,num_lst=int(data[0]),data[1:]
def my_salary(n,num_lst):
    num_lst_deal=sorted(num_lst,reverse=True,key=lambda x:int(x[0]))
    for i in range(len(num_lst_deal)-1):
        for j in range(len(num_lst_deal)-i-1):
            if int(str(num_lst_deal[j+1])+str(num_lst_deal[j]))>int(str(num_lst_deal[j])+str(num_lst_deal[j+1])):
                u=num_lst_deal[j]
                num_lst_deal[j]=num_lst_deal[j+1]
                num_lst_deal[j+1]=u
    return num_lst_deal
o=my_salary(n,num_lst)
result=""
for i in range(len(o)):
    result+=o[i]
print(result)

To sum up , the fundamental thing in greedy algorithm is that confirming the standard of comparing two different object, then following the help of this function we can find a set of objects which is correct. Then analyze the requirement of the project, give out the correct answer.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值