#include<iostream>#include<algorithm>usingnamespace std;int l, n, a[5010];intmain(){
cin >> l >> n;for(int i =0; i < n; i++){
cin >> a[i];}sort(a, a+n);int mintime =0, maxtime =0;for(int i =0; i < n; i++){int left = a[i], right = l +1- a[i];
mintime =max(mintime,min(left, right));
maxtime =max(maxtime,max(left, right));}
cout << mintime <<" "<< maxtime << endl;return0;}
2. [洛谷P1223]排队接水
2-1. 题干
2-2. 解析
求每个人的平均等待时间,人数是固定的,所以仅需求出最小的总等待时间
每个人为总等待时间贡献的时间,是每个人各自接水的时间乘以现在队伍中的人数
根据贪心的思想,每个位置均使两者的乘积最大即可求得题解
2-3. 原码
#include<iostream>#include<algorithm>#include<iomanip>usingnamespace std;int n, a[1010];bool used[1010];double sum =0.0;intmain(){
cin >> n;for(int i =0; i < n; i++){
cin >> a[i];}for(int i =0; i < n; i++){int min =1000000, num =0;for(int j =0; j < n; j++){if(a[j]< min &&!used[j]){
min = a[j];
num = j;}}
sum += a[num]*(n - i -1);
used[num]=true;
cout << num +1;if(i < n -1){
cout <<" ";}else{
cout << endl;}}
sum /= n;
cout << fixed <<setprecision(2)<< sum << endl;return0;}
3. [洛谷P1803] 凌乱的yyy/线段覆盖
3-1. 题干
3-2. 解析
线段覆盖,线段这样的叫法很形象。排序之后根据条件选择需要的线段,类似于数轴上取点
3-3. 原码
#include<iostream>#include<algorithm>usingnamespace std;structgames{int begin;int end;} game[1000010];int n, gamenum =1;bool used[1000010];boolcon(games a, games b){return a.end < b.end;}intmain(){
cin >> n;for(int i =0; i < n; i++){
cin >> game[i].begin >> game[i].end;}sort(game, game + n, con);int now = game[0].end;for(int i =1; i < n; i++){if(game[i].begin >= now){
now = game[i].end;
gamenum++;}}
cout << gamenum << endl;return0;}
4. [洛谷P1031] [NOIP2002 提高组] 均分纸牌
4-1. 题干
4-2. 解析
卡牌总数必为卡牌堆数的倍数,即平均值必为整数,因此正反遍历与取中的效果是一致的,可以直接遍历解决
4-3. 原码
#include<iostream>usingnamespace std;int n, a[10010];intmain(){double sum =0.0;int ans =0;
cin >> n;for(int i =0; i < n; i++){
cin >> a[i];
sum += a[i];}
sum /= n;for(int i =0; i < n; i++){if(a[i]- sum !=0){
a[i +1]+= a[i]- sum;
ans++;}}
cout << ans << endl;return0;}