A题:
Weighted Median
Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
For n elements x1, x2, ..., xn with positive integer weights w1, w2, ..., wn. The weighted median is the element xk satisfying
and , S indicates
and , S indicates
Can you compute the weighted median in O(n) worst-case?
输入
There are several test cases. For each case, the first line contains one integer n(1 ≤ n ≤ 10^7) — the number of elements in the sequence. The following line contains n integer numbers xi (0 ≤ xi ≤ 10^9). The last line contains n integer numbers wi (0 < wi < 10^9).
输出
One line for each case, print a single integer number— the weighted median of the sequence.
示例输入
7 10 35 5 10 15 5 20 10 35 5 10 15 5 20
示例输出
20
提示
The S which indicates the sum of all weights may be exceed a 32-bit integer. If S is 5,
equals 2.5.
来源
2014年山东省第五届ACM大学生程序设计竞赛
示例程序
解题思路:
题目说让用O(n)的算法来走,但是最后我还用了nlogn的方法,用了sort预先处理了一下。然后算出排完顺序后的前缀和,用sum-前缀和-这个位置的权重得到了后缀和,
然后再依次枚举出了最后的结果。
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
using namespace std;
# define MAX 10000000
struct node
{
int value;
int wei;
}a[MAX];
int cmp ( const struct node & x, const struct node & y )
{
return x.value < y.value;
}
int main(void)
{
int n;
while ( cin>>n )
{
for ( int i = 0;i < n;i++ )
{
cin>>a[i].value;
}
long long sum = 0;
for ( int i = 0;i < n;i++ )
{
cin>>a[i].wei;
sum+=a[i].wei;
}
long double sum1 = 1.0*sum/2;
sort(a,a+n,cmp);
long long max_limit = 0;
long long min_limit = 0;
int pos_wei;
for ( int i = 1;i < n-1;i++ )
{
min_limit = min_limit + a[i-1].wei;
max_limit = sum - min_limit - a[i].wei;
if ( min_limit < sum1 && (max_limit <= sum1) )
{
pos_wei = a[i].value;
break;
}
}
cout<<pos_wei<<endl;
}
return 0;
}
B题:
YC大牛的判题任务
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name:
Main
第七届北京师范大学程序设计竞赛要开始了.今年的比赛规模比以前大多了,而且还要邀请外校的大牛来友情参赛.
今年比赛系统采用了我们YC大牛编写的OJ(OnlineJudge).为了更好的服务校赛,YC大牛准备测试一下OJ的判题效率.
他测试的方法是,先提交N个程序,然后打开判题程序开始判题,每次都只判一个题目,当有一个题目在OJ上运行的时候,其他程序就只有等待.当一个程序运行完后,会立刻选择另外一个程序来运行,直到所有程序都在OJ上判完.
YC会测定一下所有程序的等待时间之和,以此作为判题效率的指标.
现在YC大牛做了一次测试,他想看看实际判题结果和理论上最优的判题结果有多大差异.现在给你所有题目在实际判题的时候的运行时间,让你找出理论上使等待时间总和最小的判题顺序(存在多个相同等待时间的判题方案时候,让编号小的尽可能先判.)
今年比赛系统采用了我们YC大牛编写的OJ(OnlineJudge).为了更好的服务校赛,YC大牛准备测试一下OJ的判题效率.
他测试的方法是,先提交N个程序,然后打开判题程序开始判题,每次都只判一个题目,当有一个题目在OJ上运行的时候,其他程序就只有等待.当一个程序运行完后,会立刻选择另外一个程序来运行,直到所有程序都在OJ上判完.
YC会测定一下所有程序的等待时间之和,以此作为判题效率的指标.
现在YC大牛做了一次测试,他想看看实际判题结果和理论上最优的判题结果有多大差异.现在给你所有题目在实际判题的时候的运行时间,让你找出理论上使等待时间总和最小的判题顺序(存在多个相同等待时间的判题方案时候,让编号小的尽可能先判.)
Input
第1行是一个整数N,代表测试数据的组数.
第2行开始的N行,每行是一组测试数据.
从第2行到N+1行每行以一个M(0<=M<=3000)开始,代表有M个程序等待判题,接着是M个整数,依次代表从编号1到M的题目的运行时间.
第2行开始的N行,每行是一组测试数据.
从第2行到N+1行每行以一个M(0<=M<=3000)开始,代表有M个程序等待判题,接着是M个整数,依次代表从编号1到M的题目的运行时间.
Output
对应于每组输入,首先输出数据编号(如样例所示),然后输出M个数,代表最优的判题顺序.
Sample Input
2 5 1 1 1 1 1 6 1 2 3 4 5 6
Sample Output
Case 1: 1 2 3 4 5 Case 2: 1 2 3 4 5 6
Source
解题思路:
这道题其实也是简单的贪心问题,但是这道题让我学会了stable_sort()函数和sort()函数的区别,我知道了,如果使用sort函数的话,会对于两个相等的元素进行换位处理,但是如果是stable_sort()就是我们说的稳固排序的话,我们就不会怕这样的情况产生了,比如说1 4 6 4' 9 。。用sort拍完后,会产生 1 4' 4 9 的情况,而如果用stable_sort()排完后,肯定是1 4 4' 9,题目要求的是,如果等待时间相同,那么就输出题目编号较小的那个题号。。。这样看来,我用sort交了4次,都是WA,,用stable_sort一次就A了。。
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
using namespace std;
# define MAX 3333+4
struct node
{
int time;
int id;
}a[MAX];
int cmp ( const struct node & x,const struct node & y )
{
return x.time < y.time;
}
int main(void)
{
int t;cin>>t;
int icase = 1;
while ( t-- )
{
int n;cin>>n;
for ( int i = 0;i < n;i++ )
{
cin>>a[i].time;
a[i].id = i+1;
}
stable_sort(a,a+n,cmp);
printf("Case %d:",icase++);
for ( int i = 0;i < n;i++ )
{
cout<<" "<<a[i].id;
}
cout<<endl;
}
return 0;
}