本来以为用set做就够烦了,后来想想最简的打表也并不清爽,心里有点平衡。。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
const int MAXN = 1005;
const int INF = INT_MAX;
int main(){
// freopen("in.txt", "r", stdin);
int n, k, x;
while(~scanf("%d", &n)){
set<int> myset;
for(int i = 0; i < n; i++){
scanf("%d", &x);
myset.insert(x);
}
scanf("%d", &k);
set<int>::iterator it;
int time = 1;
for(it = myset.begin(); it != myset.end(); it++){
if(time == k){
cout << *it << endl;
break;
}
time ++;
}
}
return 0;
}
哈夫曼树水题,顺便复习优先队列,不过要记住输出的是最大权值和而非顶点值!
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#include <climits>
using namespace std;
const int MAXN = 1005;
const int INF = INT_MAX;
int main(){
// freopen("in.txt", "r", stdin);
int n, x;
while(~scanf("%d", &n)){
if(n == 0) break;
priority_queue<int, vector<int>, greater<int> > myqueue;
for(int i = 0; i < n; i++){
scanf("%d", &x);
myqueue.push(x);
}
int ans = 0;
while(myqueue.size() > 1){
int x1 = myqueue.top();
myqueue.pop();
int x2 = myqueue.top();
myqueue.pop();
ans += (x1 + x2);
myqueue.push(x1 + x2);
}
printf("%d\n", ans);
}
return 0;
}