#第一题
P1199 [NOIP2010 普及组] 三国游戏
居然是选一对最高,不是和最高…既然如此小明先手,最高的组合都抢不到,小明比能抢第二高的,所以小明必胜,直接输出第二大就行了。
#include <bits/stdc++.h>
using namespace std;
int ori[600][600];
int n;
int main() {
cin >> n;
for (int i = 1; i < n; i++) {
for (int j = i+1; j < n+1; j++) {
cin >> ori[i][j];
ori[j][i] = ori[i][j];
}
}
int sum = 0;
for (int i = 1; i <= n; i++) {
sort(ori[i]+1, ori[i] + 1+ n);
sum = max(sum, ori[i][n - 1]);
}
cout << 1 << endl;
cout << sum;
}
#第二题
P1007 独木桥
最小时间是离中线最近的出去的时间,最大时间是离边线最近的出去的最长时间。
#include <bits/stdc++.h>
using namespace std;
int len,n;
int temp;
int maxt=0;
int mint=0;
int main() {
cin >> len >> n;
for (int i = 0; i < n; i++) {
cin >> temp;
int r = temp - 0;
int l = len - temp+1;
if (r > l)swap(r, l);
maxt = max(maxt, l);
mint = max(mint, r);
}
cout << mint << " " << maxt;
}
#第三题
P1223 排队接水
这不就学习通里的例题,我终于看明白了平均时间是指每一个顾客等待的时间,不是单纯的累加,
#include <bits/stdc++.h>
using namespace std;
int n;
int ori[2000];
int num[2000];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> ori[i];
}
for (int i = 1; i <= n; i++)num[i] = i;
int temp = 0;
for (int j = 0; j < n; j++) {
for (int i = 1; i < n; i++) {
if (ori[i + 1] < ori[i]) {
swap(ori[i + 1], ori[i]);
swap(num[i + 1], num[i]);
}
}
}
for (int i = 1; i <= n; i++)cout << num[i]<<" ";
cout << endl;
double sum = 0;
for (int i = 1; i <= n; i++) sum += ori[i] * (n - i);
sum = sum / n;
cout << fixed << setprecision(2);
cout << sum;
}
#第四题
P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
我说学长为什么发个优先队列的stl出来,原来这里用,
#include <bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> > ori;
int n;
int ans;
int sum = 0;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int temp;
cin >> temp;
ori.push(temp);
}
while (1) {
ans = ori.top();
ori.pop();
if (ori.empty())break;
ans += ori.top();
sum += ans;
ori.pop();
ori.push(ans);
}
cout << sum;
}