贪心30分求助
查看原帖
贪心30分求助
726870
Rainber楼主2023/6/14 17:04
#include<cstdio>
template <typename Type>
class list
{
	private:
		struct node
		{
			Type data;
			node *next;
		};
		node *h=new node,*p,*q;
		int len=-1;
	public:
		Type index(int id)
		{
			int i;
			p=h;
			for(i=0;i<=id;++i)
			{
				p=p->next;
			}
			return p->data;
		}
		void set(int id,Type data)
		{
			int i;
			p=h;
			for(i=0;i<=id;++i)
			{
				p=p->next;
			}
			p->data=data;
		}
		void append(Type data)
		{
			int i;
			p=h;
			for(i=0;i<=len;++i)
			{
				p=p->next;
			}
			len++;
			p->next=new node;
			p=p->next;
			p->next=NULL;
			p->data=data;
		}
		void del(int index)
		{
			int i;
			p=h;
			for(i=0;i<index;++i)
			{
				p=p->next;
			}
			q=p->next;
			p->next=q->next;
			delete q;
		}
		int getlen()
		{
			return len;
		}
};
int main()
{
	list<unsigned long long> ls;
	int i,j,n,r,min,ind;
	unsigned long long ans=0;
	scanf("%d",&n);
	for(i=0;i<n;++i)
	{
		scanf("%d",&r);
		ls.append(r);
	}
	for(i=0;i<n-1;++i)
	{
		min=1e9;
		ind=-1;
		for(j=0;j<n-1-i;++j)
		{
			if(ls.index(j)+ls.index(j+1)<min)
			{
				min=ls.index(j)+ls.index(j+1);
				ind=j;
			}
		}
		ls.del(ind);
		ls.set(ind,min);
		ans+=min;
	}
	printf("%llu",ans);
	return 0;
}

码风有点凌乱哈

思路概括

因为合并次数相同,大堆的要尽量少合并几次,每次选择和最小的两堆合并,经过n-1次合并累加得到答案

大佬使劲喷,别客气

2023/6/14 17:04
加载中...