POJ 2442

直接用优先队列bfs+set判重水过,需要注意的是,因为m<=100,所以用short就可以不超内存了= =!

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 #include<queue>

 5 #include<set>

 6 using namespace std;

 7 int ar[105][2005],n,m;

 8 struct data

 9 {

10     short p[105];

11     int sum;

12     bool operator<(const data &ne)const

13     {

14         if(sum!=ne.sum)

15             return sum>ne.sum;

16         else

17         {

18             for(int i=0;i<m;i++)

19             {

20                 if(p[i]!=ne.p[i])

21                     return p[i]>ne.p[i];

22             }

23             return false;

24         }

25     }

26 };

27 priority_queue<data> Q;

28 set<data> ss;

29 int main()

30 {

31     int T;

32     for(scanf("%d",&T);T;T--)

33     {

34         scanf("%d%d",&m,&n);

35         for(int i=0;i<m;i++)

36         {

37             for(int j=0;j<n;j++)

38                 scanf("%d",&ar[i][j]);

39             sort(ar[i],ar[i]+n);

40         }

41         data a;

42         while(!Q.empty())

43             Q.pop();

44         memset(a.p,0,sizeof(a.p));

45         a.sum=0;

46         for(int i=0;i<m;i++)

47             a.sum+=ar[i][0];

48         Q.push(a);

49         ss.clear();

50         for(int i=0;i<n;i++)

51         {

52             a=Q.top();

53             Q.pop();

54             if(ss.find(a)!=ss.end())

55             {

56                 i--;

57                 continue;

58             }

59             ss.insert(a);

60             if(i)

61                 printf(" ");

62             printf("%d",a.sum);

63             for(int j=0;j<m;j++)

64             {

65                 a.p[j]++;

66                 a.sum+=ar[j][a.p[j]]-ar[j][a.p[j]-1];

67                 Q.push(a);

68                 a.sum-=ar[j][a.p[j]]-ar[j][a.p[j]-1];

69                 a.p[j]--;

70             }

71         }

72         printf("\n");

73     }

74     return 0;

75 }

你可能感兴趣的:(poj)