http://codeforces.com/problemset/problem/840/A
题目意思的算最小期望,给出2行数,第二行代表的是期望计算的概率,只不过是分子部分(可以这么看);
然后计算第一行的数字乘以第二行数字的总和最小,将重新排序后的第一行数字输出。
其实只要在输入的时候加入一个代表顺序的优先级变量来记录顺序就好了,然后就可以随心所欲的按要求对号入座了。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int num;
int xu;
int na;
}sum[222222];
bool cmp1(node x,node y)
{
if(x.num==y.num)return x.xu>y.xu;
return x.num<y.num;
}
bool cmp2(node x,node y)
{
return x.xu<y.xu;
}
bool cmp3(int x,int y)
{
return x>y;
}
int main(){
int n,k;
while(cin>>n)
{
int a[222222];
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&sum[i].num);
sum[i].xu=i;
}
sort(a,a+n,cmp3);
sort(sum,sum+n,cmp1);
for(i=0;i<n;i++)
sum[i].na=a[i];
sort(sum,sum+n,cmp2);
int q=0;
for(i=0;i<n;i++)
{
if(q++)cout<<" ";
cout<<sum[i].na;
}
cout<<endl;
}
return 0;
}