排队打水
思路
类似于最短作业优先算法,但是也有可能产生饥饿,但是这里不考虑。
先排序,再计算每一个作业会让后面的作业等待的时间
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int a[N];
int main(){
int n;
cin>>n;
for(int i = 0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
long long ans = 0;
for(int i =0;i<n;i++){
ans +=a[i]*(n-1-i);
}
cout<<ans;
return 0;
}
货仓选址
确定中点,只要没有多余的路径就行;
代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int a[N];
int main(){
int n;
cin>>n;
for(int i = 0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int mid = n/2;
int x =a[mid];
long long ans = 0;
for(int i = 0;i<mid;i++){
ans += x-a[i];
}
for(int i = mid+1;i<n;i++){
ans += a[i]-x;
}
cout<<ans;
return 0;
}
acrobatic oxen
耍杂技的牛
思路:
将wi和si从小到大排列,这样排出来的风险值最小,再计算每一头牛的风险值,可以证明出,如果不这样排队,那么按照这样的趋势交换以后的风险值能够降低。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
struct niu{
int w,s,a;
bool operator<(const niu &n)const{
return a<n.a;
}
}a[N];
int main() {
cin>>n;
for(int i = 0;i<n;i++)
{
scanf("%d%d",&a[i].w,&a[i].s);
a[i].a = a[i].w+a[i].s;
}
sort(a,a+n);
int tmp = -a[0].s;
int f = tmp;
for(int i = 1;i<n;i++){
tmp +=a[i-1].s;
tmp +=a[i-1].w;
tmp -=a[i].s;
f = max(f,tmp);
}
cout<<f;
return 0;
}