问题标题: 1175 糖果奖励(sugar)

1
0

1
已采纳
谢祎恒
谢祎恒
中级守护
中级守护

贪心+结构体排序

伪代码如下

#include<iostream>
using namespace std;
void qsort(int,int);
struct sugar
{
    int td;
    int tj;
}x[1000100];
bool compare(sugar a,sugar b)
{
    比较函数
}
void qsort(int l,int r)
{
    快排
}
(加在一起为结构体排序)
int main()
{
    long long i,n,max1=0,max2=0,k;
    cin>>n>>k;
    for(i=0;i<n;i++)
    {
        cin>>x[i].td;
    }   
    for(i=0;i<n;i++)
    {
        cin>>x[i].tj;
    }
    qsort(0,n-1);
    for(i=0;i<k;i++)
    {
        相加
    }
    输出
    return 0;
}
0
0
叶卓舒
叶卓舒
初级守护
初级守护

这题是贪心算法(贪心算法学过吧😑),贪心策略:甜度从大到小排序,如果相同则体积大的排在前面。

排序如下:

procedure qsort(l,r:longint);
var
    i,j,t,mid,mid1:longint;
begin
    i:=l;
    j:=r;
    mid:=a[(l+r) div 2];
    mid1:=b[(l+r) div 2];
    repeat
        while (a[i]>mid) or (a[i]=mid) and (b[i]>mid1) do inc(i);
        while (a[j]<mid) or (a[j]=mid) and (b[j]<mid1) do dec(j);
        if i<=j then
        begin
            t:=a[i];
            a[i]:=a[j];
            a[j]:=t;
            t:=b[i];
            b[i]:=b[j];
            b[j]:=t;
            inc(i);
            dec(j);
        end;
    until i>j;
    if l<j then qsort(l,j);
    if i<r then qsort(i,r);
end;

排序完后把前k个甜度相加,再把前k个体积相加,最后输出就行了。

0
颜咏春
颜咏春
中级光能
中级光能

procedure qsort(l,r:longint);

var

i,j,t,mid,mid1:longint;

begin

i:=l;

j:=r;

mid:=a[(l+r) div 2];

mid1:=b[(l+r) div 2];

repeat

while (a[i]>mid) or (a[i]=mid) and (b[i]>mid1) do inc(i);

while (a[j]<mid) or (a[j]=mid) and (b[j]<mid1) do dec(j);

if i<=j then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

t:=b[i];

b[i]:=b[j];

b[j]:=t;

inc(i);

dec(j);

end;

until i>j;

if l<j then qsort(l,j);

if i<r then qsort(i,r);

end;

0
我要回答