编程之美2014格格取数

来源:互联网 发布:java 打war包 编辑:程序博客网 时间:2024/04/28 06:22
#include <stdio.h>#include <vector>#include <algorithm>#include <iostream>using namespace std;int last;//剩下未覆盖的边或行数int boolx[100];//经过边或行的数量int booly[100];int m,n;//行数,列数unsigned int mini;typedef struct point{unsigned int v;//值unsigned int x;//坐标unsigned int y;};bool more(const point &a,const point &b){return a.v>b.v;}bool lesss(const point &a,const point &b){return a.v<b.v;}vector<point> all;vector<point> np;void delp(int x,int y,int v){//if(boolx[x]>1&&booly[y]>1){boolx[x]--;booly[y]--;}else mini += v;}void addp(int x,int y){if(boolx[x] == 0)last--;if(booly[y] == 0)last--;boolx[x]++;booly[y]++;}int main(){int i,j,T,t = 1;unsigned int s;cin>>T;point p;while(T--){cin>>m>>n;for( i = 0 ;i<m;i++){for( j = 0;j<n;j++){cin>>s;p.x = i;p.y = j;p.v = s;all.push_back(p);boolx[i] = 0;booly[j] = 0;}}sort(all.begin(),all.end(),lesss);last = n + m;i = 0;while(last > 0){addp(all[i].x,all[i].y);np.push_back(all[i++]);}mini = 0;sort(np.begin(),np.end(),more);for( i =0; i<np.size();i++)delp(np[i].x,np[i].y,np[i].v);all.clear();np.clear();printf("Case %d: ",t++);cout<<mini<<endl;}return 0;}

0 0
原创粉丝点击