作业2.7

🙂UVA是什么牛马

注册了无数次后终于成功,与洛谷绑定1:54~2:40

绑定后登不上去+洛谷日爆3:00~4:30

瑞瑞的木板就是合并果子,就是我靠sort水过二叉堆的那个

暴力代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long m=0,n,b,a[11111];
	scanf("%lld",&n);
	for(int i=0;i<n;i++){
		scanf("%lld",&a[i]);
	}sort(a,a+n);
	for(int i=0;i<n-1;i++){
		m=m+a[i]+a[i+1];
		a[i+1]=a[i]+a[i+1];
		sort(a+i+1,a+n);
	}printf("%lld",m);
	return 0;
}

AC代码(优先队列):

#include<bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		q.push(x);
	}
	while(q.size()>=2)
	{
		int a=q.top();
		q.pop();
		int b=q.top();
		q.pop();
		ans+=a+b;
		q.push(a+b);
	}
	cout<<ans<<endl;
	return 0;
}

关于block,我就没这么委屈过!调了近两个小时,交上去T掉了!还就一个点!部分分都莫得!!!

TLE代码:重复运算,判断(注意叹号处b的积木要保留!!!!!!!)

#include<bits/stdc++.h>
using namespace std;
int pa,pb,ha,hb;
char s1[30],s2[30];
int a,b,n;
vector<int >q[30]; 
void search()
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<q[i].size();j++)
		{
			if(q[i][j]==a)
			{
				ha=i;
				pa=j;
			}
			if(q[i][j]==b)
			{
				hb=i; 
				pb=j;
			}
		}
	}
}
void move_onto()
{
	for(int i=pa+1;i<q[ha].size();i++)
	{
		q[q[ha][i]].push_back(q[ha][i]);
	}
	for(int i=pb+1;i<q[hb].size();i++)
	{
		q[q[hb][i]].push_back(q[hb][i]);
	}
	q[ha].resize(pa);
	q[hb].resize(pb+1);///!!!!!!!!!!!
	q[hb].push_back(a);
}
void move_over()
{
	for(int i=pa+1;i<q[ha].size();i++)
	{
		q[q[ha][i]].push_back(q[ha][i]);
	}
	q[ha].resize(pa);
	q[hb].push_back(a);
}
void pile_onto()
{
	for(int i=pb+1;i<q[hb].size();i++)
	{
		q[q[hb][i]].push_back(q[hb][i]);
	}
	q[hb].resize(pb+1);
	for(int i=pa;i<q[ha].size();i++)
	{
		q[q[hb][i]].push_back(q[ha][i]);
	}
	q[ha].resize(pa);
}
void pile_over()
{
	for(int i=pa;i<q[ha].size();i++)
	{
		q[hb].push_back(q[ha][i]);
	}
	q[ha].resize(pa);
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		q[i].push_back(i);
	}
	while(1)
	{
		scanf("%s",s1);
		if(strcmp(s1,"quit")==0)break;
		scanf("%d%s%d",&a,s2,&b);
		search();
		if(ha==hb)continue;
		if(strcmp(s1,"move")==0&&strcmp(s2,"onto")==0)move_onto();
		if(strcmp(s1,"move")==0&&strcmp(s2,"over")==0)move_over();
		if(strcmp(s1,"pile")==0&&strcmp(s2,"onto")==0)pile_onto();
		if(strcmp(s1,"pile")==0&&strcmp(s2,"over")==0)pile_over();
	}
	for(int i=0;i<n;i++)
	{
		printf("%d:",i);
		for(int j=0;j<q[i].size();j++)
		{
			printf(" %d",q[i][j]);
		}
		printf("\n");
	}
	return 0;
}

AC代码:

#include <bits/stdc++.h>
using namespace std; 
string s1,s2;
int n,a,b;
vector<int>v[10010];
void work(int a,int &p,int &h)
{
    for(int i=0;i<n;i++)
    {
        int len=v[i].size();
        for(int j=0;j<len;j++)
            if (v[i][j]==a)
            {
                p=i;
				h=j;
                return;
            }
    }
}
void clear(int p,int h)
{
    int lenv=v[p].size();
    for(int j=h+1;j<lenv;j++)
        v[v[p][j]].push_back(v[p][j]);
    v[p].resize(h+1);
}
void add(int p1,int h1,int p2)
{
    int lenv=v[p1].size();
    for(int j=h1;j<lenv;j++)
        v[p2].push_back(v[p1][j]);
    v[p1].resize(h1);
}
int main()
{ 
    scanf("%d", &n);
    for(int i=0;i<n;i++) v[i].push_back(i);
    while(cin>>s1)
    {
        if(s1=="quit") break;
        cin>>a>>s2>>b;
        int p1,h1,p2,h2;
        work(a,p1,h1);
        work(b,p2,h2);
        if(p1==p2) continue;
        if(s1=="move") clear(p1, h1);
        if(s2=="onto") clear(p2, h2);
        add(p1,h1,p2);
    }
    for(int i=0;i<n;i++)
    {
        printf("%d:",i);
        for(int j=0;j<v[i].size();j++) printf(" %d", v[i][j]);
        printf("\n");
    }
    return 0;
}

关于结构体内堆的重载,注意大根堆重载小于号,小根堆重载大于号

struct node
{
	int x,y; 
	bool operator<(const node & a)const
	{ return x<a.x; }
}k;

 

posted @ 2022-02-07 20:32  fervency  阅读(32)  评论(0编辑  收藏  举报