标签:贪心
贪心策略:因为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