题意描述
有n头奶牛跑到FJ的花园里去吃花儿了,它们分别在距离牛圈T分钟处吃花儿,每分钟会吃掉D朵卡哇伊的花儿,(此处有点拗口,不要在意细节啊!),FJ现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为2*T分钟,在这段时间内,其它的奶牛会继续吃FJ卡哇伊的花儿,速度保持不变,当然正在被赶回牛圈的奶牛就没口福了!现在要求以一种最棒的方法来尽可能的减少花儿的损失数量,求奶牛吃掉花儿的最少朵数!
输入描述:
Line 1: A single integer N
Lines 2..N+1: Each line contains two space-separated integers, Ti and Di, that describe a single cow's characteristics
输出描述:
Line 1: A single integer that is the minimum number of destroyed flowers
思路
显然可以看出此题具有很明显的贪心的特征,我们把其中两只奶牛的运输放在一起看,那么对剩下奶牛的影响与这两头奶牛运输的先后顺序无关,所以取决两头奶牛运输顺序的就是这两头奶牛在不同顺序下的损耗。我们把这两头牛的时间分别设为x1,x2,把他们的每分钟的食草速度设成y1,y2.
如果先运奶牛1: 造成的损耗是:x1 * y2
如果先运奶牛2: 造成的损耗是:x2 * y1
那么我们得到的排序方式的代码段就是:
bool cmp(int x,int y){ return a[x]*b[y]<b[x]*a[y]; }
有了顺序就能算出最小损失
代码
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define mp make_pair #define lowbit(x) x&(-x) typedef long long ll; typedef pair<int,int> pii; typedef pair<ll, ll> pll; const int N = 1e5+5; const ll mod = 1e9+7; const int INF = 0x3f3f3f3f; const double eps =1e-9; const double PI=acos(-1.0); const int dir[4][2]={-1,0,1,0,0,-1,0,1}; const int exdir[4][2]={1,1,1,-1,-1,1,-1,-1}; ll qpow(ll x,ll y){ ll ans=1,t=x; while(y>0){ if(y&1)ans*=t,ans%=mod; t*=t,t%=mod; y>>=1; } return ans%mod; } ll a[N],b[N],c[N],sum[N]; bool cmp(int x,int y){ return a[x]*b[y]<b[x]*a[y]; } void solve(){ int n;cin>>n; for(int i=0;i<n;i++)cin>>a[i]>>b[i]; for(int i=0;i<n;i++)c[i]=i; sort(c,c+n,cmp); for(int i=0;i<n;i++){ int now=c[i]; sum[i]+=b[now]; if(i)sum[i]+=sum[i-1]; } ll ans=0; for(int i=0;i<n;i++){ int now=c[i]; ans+=(sum[n-1]-sum[i])*a[now]*2; } cout<<ans; } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); //int t;cin>>t; //while(t--)solve(),cout<<'\n'; solve(); return 0; }