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;
}


目录
相关文章
UVa11876 - N + NOD (N)
UVa11876 - N + NOD (N)
64 0
uva127 "Accordian" Patience
uva127 "Accordian" Patience
43 0
UVa11776 - Oh Your Royal Greediness!
UVa11776 - Oh Your Royal Greediness!
53 0
UVa 10082 WERTYU
UVa 10082 WERTYU
127 0
|
机器学习/深度学习
uva 11538 Chess Queen
点击打开链接 题意:给定一个n*m的矩阵,问有多少种方法放置两个相互攻击的皇后?规定在同一行同一列和同对角线的能够相互攻击 思路: 1 先考虑同一行的情况,n行就有n种情况,每一行有m*(m-1)种,总的是n*m*(m-1); 2 考虑同...
818 0
|
C++
uva 11136 Hoax or what
点击打开链接uva 11136 思路: STL 分析: 1 题目意思比较不好理解,理解了题目之后我们可以利用STL的multiset来做 2 每次找到最大和最小的值,然后求解即可 代码: #include #include #in...
845 0
uva 1394 - And Then There Was One
点击打开链接uva 1394 思路: 数学递推 分析: 1 题目是一道变形的约瑟夫环变形问题 2 网上看到一篇很好的数学递推法 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。
992 0
|
SQL
uva 10881 - Piotr's Ants
点击打开链接uva 10881 思路:模拟 分析: 1 如果把蚂蚁看成是没有区别的点,那么只需计算出每只蚂蚁在t秒之后的位置即可。比如有三只蚂蚁,蚂蚁1 = (1,L),蚂蚁2 = (3 , L) , 蚂蚁3 = (4,L),则两秒钟之后,3只蚂蚁的位置分别为(3 , R) , (1 , L) , (2 , L)。
816 0