题干解析
解题思路
- 首先读入,然后排序,计算总时间,输出
- 什么?怎么排序?
玄学就好了 就是… 点这里 - 补一点别人没有的:
- 一本通上的不能快排,要用有稳定性的排序方法
洛谷解法
#include<bits/stdc++.h>
using namespace std;
int n,m,sum1,sum2,x[10001],y[10001],t;
struct Node{
int a,b,c,k,s;
}s[10001];
bool cmp(Node o,Node p){
return o.k<p.k;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&s[i].a);
for(int i=1;i<=n;i++){
scanf("%d",&s[i].b);
s[i].s=i;s[i].k=min(s[i].a,s[i].b);
}
sort(s+1,s+1+n,cmp);
sum2=n;
for(int i=1;i<=n;i++){
if(s[i].k==s[i].a){
x[++sum1]=i;
}
else{
x[sum2--]=i;
}
}
int t1=0,t2=0;
for(int i=1;i<=n;i++){
t1+=s[x[i]].a;
t2=max(t1,t2);
t2+=s[x[i]].b;
}
printf("%d\n",t2);
for(int i=1;i<=n;i++){
printf("%d ",s[x[i]].s);
}
return 0;
}
一本通解法
#include<bits/stdc++.h>
using namespace std;
int n,m,sum1,sum2,x[100001],y[100001],t;
struct Node{
int a,b,c,k,s;
}s[10001];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i].a;
for(int i=1;i<=n;i++){
cin>>s[i].b;
s[i].s=i;s[i].k=min(s[i].a,s[i].b);
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(s[i].k>s[j].k){
swap(s[i].k,s[j].k);
swap(s[i].a,s[j].a);
swap(s[i].b,s[j].b);
swap(s[i].s,s[j].s);
}
}
}
sum2=n;
for(int i=1;i<=n;i++){
if(s[i].k==s[i].a){
x[++sum1]=i;
}
else{
x[sum2--]=i;
}
}
int t1=0,t2=0;
for(int i=1;i<=n;i++){
t1+=s[x[i]].a;
t2=max(t1,t2);
t2+=s[x[i]].b;
}
cout<<t2<<endl;
for(int i=1;i<=n;i++){
cout<<s[x[i]].s<<" ";
}
printf("\n");
return 0;
}