1、UVALive 3135 Argus
题意:有若干注册信息,每个id每经过一个周期返回一个id信息。求前k个返回信息的id。如果两个信息返回的时间点相同,则小的那个先返回。
思路:优先队列简单应用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include
2、uva 11997 K Smallest Sums
题意:给出k个数组,每个数组有k个元素,现在可以从每个数组各选一个数组成和,共有k^k个。求其前k小的数。
思路:优先队列+多路归并。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int num[800][800]; 8 struct pos 9 {10 int sum;11 int id;12 pos(int ss=0,int ii=0):sum(ss),id(ii){ }13 friend bool operator<(const pos&a, const pos&b)14 {15 return a.sum > b.sum;16 }17 };18 int main()19 {20 int k;21 while (~scanf("%d", &k))22 {23 for (int i = 0; i < k; i++)24 {25 for (int j = 0; j < k; j++)26 {27 scanf("%d", &num[i][j]);28 }29 sort(num[i], num[i] + k);30 }31 //多路归并32 for (int i = 1; i < k; i++)33 {34 priority_queue q;35 for (int j = 0; j < k; j++) q.push(pos(num[0][j] + num[i][0], 0));36 for (int j = 0; j < k; j++)37 {38 pos u = q.top();39 q.pop();40 num[0][j] = u.sum;41 if (u.id + 1 < k) q.push(pos(u.sum - num[i][u.id] + num[i][u.id + 1], u.id + 1));42 }43 }44 for (int i = 0; i < k; i++)45 {46 if (i) printf(" ");47 printf("%d", num[0][i]);48 }49 printf("\n");50 }51 return 0;52 }
3、uva 11136 Hoax or what
题意:每天员工都会向箱子里放他们的业绩单,每天结束的时候,老板从中挑出最高和最低的两份,并奖励高业绩的人数目为业绩之差的奖金。问老板要给出多少奖金。
思路:
①两个优先队列。注意一个优先队列的元素可能在另一个优先队列里已经pop。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn = 1000100; 7 int numq1[maxn]; 8 int numq2[maxn]; 9 int main()10 {11 int n;12 while (~scanf("%d", &n))13 {14 if (n == 0) break;15 priority_queue