作业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;