标签:贪心
贪心策略:因为2*难度(1~100) 远比500*时间 的影响小,所以说,先对时间从大到小排序,相等的再按照等级从大到小排序;对任务和机器都排序之后,再统计满足任务时间的机器,选择等级最接近任务难度的的机器;
因为数据很多,很可能超出int范围,要用长整型,但是最后输出的时候,如果用printf( "%lld %lld\n", sol, sum );输出的话,会发现第二个数会是0,在这上面wa了n次。。
最后问了一下学长,用了%I64,才正确,后来有自己百度了一下http://blog.csdn.net/shiwei408/article/details/7463476写的很好,我就不多说了
1 2 100 3 100 2 100 1
1 50004
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef struct{
int time, lev;
}str;
str mac[100015], tas[100015];
int d[111];
int cmp( str a, str b )
{
if( a.time == b.time ) return a.lev > b.lev;
return a.time>b.time;
}
int main()
{
int n, m, i, j;
while( scanf( "%d%d", &n, &m ) != EOF ){
long long sum = 0;
long long sol = 0;
memset( d, 0, sizeof(d) );
memset( tas, 0, sizeof(tas) );
memset( mac, 0, sizeof(mac) );
for( i = 0; i < n; i ++ )
scanf( "%d%d", &mac[i].time, &mac[i].lev );
for( i = 0; i < m; i ++ )
scanf( "%d%d", &tas[i].time, &tas[i].lev );
sort( tas, tas+m, cmp );
sort( mac, mac+n, cmp );
for( i =0, j = 0; i < m; i ++ ){
while( j < n&&mac[j].time>=tas[i].time ){
d[mac[j].lev]++;
++j;
}
for( int k = tas[i].lev; k <= 100; k ++ ){
if( d[k] ){
++sol;
sum += 500*tas[i].time+2*tas[i].lev;
--d[k];
break;
}
}
}
printf( "%I64d %I64d\n", sol, sum );
//cout<<sol<<' '<<sum<<endl; //也可以用这种方法
}
return 0;
}标签:贪心
原文地址:http://blog.csdn.net/shengweisong/article/details/38057847