uva 11054 - Wine trading in Gergovia

简介: 点击打开链接uva 11054 题目意思:    有一个城市,城市里的每一个人都在做酒生意,有的人是要买进用正数表示,有的人是要卖出用负数表示。

点击打开链接uva 11054


题目意思:    有一个城市,城市里的每一个人都在做酒生意,有的人是要买进用正数表示,有的人是要卖出用负数表示。现在规定这个城市的每家每户都连在一起,还有L升酒的交易代价为“两家的距离xL“,要求我们找到最小的交易代价


解题思路:     1:贪心
                       2:由于每一个人要买的或要卖的物品是一定的,那么我们知道如果要让每一个人的产生最小的交易代价就是让每一个人都和他相邻的人交易,那么这样就有最优解,所以只要从左向右枚举一遍就是O(n)的时间复杂度


代码:

1

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
using namespace std;
#define MAXN 100010

int n;
int bott[MAXN];
long long ans;

void solve() {
    int i;
    ans = 0;
    for(i = 1 ; i < n ; i++){
        bott[i] += bott[i-1];
        ans += abs(bott[i-1]);
    }
    printf("%lld\n" , ans);
}

int main() {
    //freopen("input.txt" , "r" , stdin);
    while(scanf("%d" , &n) && n){ 
        for(int i = 0 ; i < n ; i++)
            scanf("%d" , &bott[i]);
        solve();
    }
    return 0;
}

2

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
using namespace std;
#define MAXN 100010

int n;
int bott[MAXN];
long long ans;

void solve() {
    int i , j;
    for(i = 0 ; i < n ;){ 
        if(bott[i] < 0){
            for(j = i+1 ; j < n ; j++){
                if(bott[j] > 0){
                    if(abs(bott[i]) > abs(bott[j])){   
                        ans += abs(bott[j])*(j-i);
                        bott[i] += bott[j] ; bott[j] = 0; 
                    }
                    else{
                        ans += abs(bott[i])*(j-i);
                        bott[j] += bott[i] ; bott[i] = 0; 
                    }
                    break;
                }
            }
        }
        else if(bott[i] > 0){
            for(j = i+1 ; j < n ; j++){
               if(bott[j] < 0){
                    if(abs(bott[i]) > abs(bott[j])){
                        ans += abs(bott[j])*(j-i);
                         bott[i] += bott[j] ; bott[j] = 0;
                    }
                    else{  
                        ans += abs(bott[i])*(j-i);
                        bott[j] += bott[i] ; bott[i] = 0; 
                    }
                    break;
                }
            }
        }
        if(!bott[i])  i++;
    }
}

int main() {
    //freopen("input.txt" , "r" , stdin);
    while(scanf("%d" , &n) && n){ 
        for(int i = 0 ; i < n ; i++)
            scanf("%d" , &bott[i]);
        ans = 0 ; solve();
        printf("%lld\n" , ans);
    }
    return 0;
}


目录
相关文章
Uva10001 Garden of Eden
Uva10001 Garden of Eden
61 0
uva10152 ShellSort
uva10152 ShellSort
76 0
|
机器学习/深度学习
uva 11538 Chess Queen
点击打开链接 题意:给定一个n*m的矩阵,问有多少种方法放置两个相互攻击的皇后?规定在同一行同一列和同对角线的能够相互攻击 思路: 1 先考虑同一行的情况,n行就有n种情况,每一行有m*(m-1)种,总的是n*m*(m-1); 2 考虑同...
830 0
uva 11806 - Cheerleaders
点击打开链接 题意:在一个n行m列的矩形里面放k个相同的石子,要求第一行,最后一行,第一列,最后一列都要有石子。问有几种方法? 思路: 1 如果题目没有要求“第一行,最后一行,第一列,最后一列都要有石子”,那么答案就是C[n*m][k],我们用C[i][j]表示i个里面选择j个的组合数。
831 0
|
机器学习/深度学习 人工智能
uva 10870 Recurrences
点击打开uva 10870 思路:构造矩阵+矩阵快速幂 分析: 1 题目给定f(n)的表达式 f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n -3) + .
742 0
uva 10273 Eat or Not to Eat?
点击打开链接uva 10273 思路: 暴力求解 分析: 1 题目要求没有吃掉的奶牛的个数已经最后一次吃掉奶牛的天数 2 没有其它的方法只能暴力,对于n头牛的n个周期求最小公倍数,然后在2个公倍数之内暴力求解 代码: #inclu...
836 0
|
人工智能
uva 305 Joseph
点击打开链接uva 305 思路: 数学+打表 分析: 1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号 2 这一题是前k个人是好人,后面k个是坏人。
1055 0
uva 1160 X-Plosives
点击打开链接uva 1160 思路: 并查集 分析: 1 看懂题目之和就是切菜了 代码: #include #include #include #include using namespace std; const int MAXN...
778 0

热门文章

最新文章