首页 > 代码库 > hdu-4864--贪心
hdu-4864--贪心
可以很明显地知道这是个贪心 但具体怎么贪心还是有点麻烦的。
先要将 任务按时间T进行 从大到小 如果T相同 则按难度从大到小排序。
机器则相反进行排序 将难度从小到大进行排序 如果难度相同则按T从小到大。
。。。
这边 我花了很久很久去搞那个二分find()函数 还是没找出错。。
后来 Porker帮我找出来了 还是花了很久。。。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 typedef __int64 LL; 7 LL n , m; 8 LL cnt , ans; 9 const int size = 100010;10 bool vis[size];11 struct data12 {13 int T , L;14 bool operator < ( const data& p ) const15 {16 if( T==p.T )17 return L > p.L;18 return T > p.T;19 } 20 }task[size];21 struct node22 {23 int T , L;24 bool operator < ( const node& p ) const25 {26 if( L==p.L )27 return T < p.T;28 return L < p.L;29 }30 }mach[size];31 32 void init( )33 {34 memset( vis , false , sizeof(vis) );35 cnt = ans = 0;36 }37 38 int find( int x )39 {40 int L = 0 , R = n , M;41 while( L<R )42 {43 M = ( L + R ) >> 1;44 if( mach[M].L>=x )45 R = M;46 else47 L = M + 1;48 }49 return L;50 } 51 52 void solve( )53 {54 int pos;55 for( int i = 0 ; i<m ; i++ )56 {57 pos = find( task[i].L );58 for( int j = pos ; j<n ; j++ )59 {60 if( !vis[j] && mach[j].T>=task[i].T )61 {62 ++ cnt;63 ans = ans + 1LL * 500 * task[i].T + 1LL * 2 * task[i].L;64 vis[j] = true;65 break;66 }67 }68 }69 }70 71 int main()72 {73 cin.sync_with_stdio(false);74 while( cin >> n >> m )75 {76 init( );77 for( int i = 0 ; i<n ; i++ ) //机器78 {79 cin >> mach[i].T >> mach[i].L;80 }81 for( int i = 0 ; i<m ; i++ ) //任务82 {83 cin >> task[i].T >> task[i].L;84 }85 sort( mach , mach+n );86 sort( task , task+m );87 solve( );88 cout << cnt << " " << ans << endl;89 }90 return 0;91 }
hdu-4864--贪心
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。