POJ 2231 Moo Volume

这题用的是贪心算法来算的,贪心策略如下:

dist数组表示各个牛的位置距第一个牛的距离,当然之前要对牛的位置进行升序排序。

设a为第一头牛距各头牛的距离的总和,然后从第二头牛开始遍历,假设遍历到第i头牛时,那么标准为:

t=t-(n-i)*d+i*d,

各变量的含义为:t一开始为a,然后每次就是该表达式运算之后的值;

n为牛的总数;

d为第i头牛和第i-1头牛之间的距离。这个公式画图其实很好理解的。

把所有的t值加起来就是最后的结果。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=10005;
int dist[N],cow[N];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&cow[i]);
        sort(cow,cow+n);
        long long ans=0;
        for(int i=0;i<n;i++)
        {
            dist[i]=cow[i]-cow[0];
            ans+=dist[i];
        }
        long long temp=ans;
        for(int i=1;i<n;i++)
        {
            int d=dist[i]-dist[i-1];
            temp=temp-(n-i)*d+i*d;
            //printf("%lld\n",temp);
            ans+=temp;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-12-27 23:03:21

POJ 2231 Moo Volume的相关文章

贪心/poj 2231 Moo Volume

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long a[10010]; int main() { int n; scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld",&a[i]); sort(a+1,a+n+1); long long ans

poj 杂题 - 2231 Moo Volume

一开始以为是long long输入,后来发现用int就行,,,反正也是一个挺简单的题目,直接贴代码了. #include<stdio.h> #include<math.h> int cows[10005]={0}; int main(){ int n,i,j; long long res = 0,temp; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&cows[i]);

[BZOJ1679][Usaco2005 Jan]Moo Volume 牛的呼声

1679: [Usaco2005 Jan]Moo Volume 牛的呼声 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1097  Solved: 571 [Submit][Status][Discuss] Description Farmer John has received a noise complaint from his neighbor, Farmer Bob, stating that his cows are making too

POJ 2231 贪心吗?怎么感觉像是数学。。。。

过了两次用了两种不同方法,其实也差不多,如果真的暴力去求得话铁定超时,(好像优化减去一些不可能的情况也能过,但是我没尝试)所以找一下规律咯,没学过算法的渣只能靠思维做题了... #include<stdio.h> int a[10009]; int main() { int n,m,t,i,j; long long sum; while(scanf("%d",&n)!=EOF) { sum=0; for(i=1;i<=n;i++) scanf("%d

POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)

POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在,则输出-1(一开始因为没看见这个,wa了几次). 这个题的第一种做法就是用两个优先队列+贪心. /* * Created: 2016年03月27日 14时41分47秒 星期日 * Author: Akrusher * */ #include <cstdio> #include <cstdl

HDU 3466 Moo Volume

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Farmer John has received a noise complaint from his neighbor, Farmer Bob, stating that his cows are making too much noise. FJ's N cows (1 <= N <= 10,000) all

Poj_2232 Moo Volume

题目链接:http://poj.org/problem?id=2231 思路: 先排序,再推导计算公式. 代码: #include <iostream> #include <algorithm> using namespace std; int main() { long long int ans = 0, arr[10010]; int n, m; cin >> n; for ( int i = 0; i < n; ++i ) { cin >> ar

poj -2010 Moo University - Financial Aid (优先队列)

http://poj.org/problem?id=2010 "Moo U"大学有一种非常严格的入学考试(CSAT) ,每头小牛都会有一个得分.然而,"Moo U"大学学费非常昂贵,并非每一头小牛都能支付的起,很多小牛都需要经济援助,但是学校只有有限的资金F. "Moo U"大学只会从C个学生里选N个学生出来,(N是奇数),但是希望N头小牛CSAT得分的中位数越高越好.输入N,C,F 接下来C行,每行包括一个得分和需要申请的经济援助,输出符合条件

B - Moo Volume

Farmer John has received a noise complaint from his neighbor, Farmer Bob, stating that his cows are making too much noise. FJ's N cows (1 <= N <= 10,000) all graze at various locations on a long one-dimensional pasture. The cows are very chatty anim