zoukankan      html  css  js  c++  java
  • UVA 10954 Add All

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <vector>
     4 #include <algorithm>
     5 #define sc(x) scanf("%d",&x)
     6 #define pf(x) printf("%d
    ", x)
     7 #define FOR(i,b,e) for(int i=b; i<=e; i++)
     8 using namespace std;
     9 vector <int> v;
    10 int main()
    11 {
    12     int n;
    13     while(~sc(n), n)
    14     {
    15         int tmp, sum = 0, i, j;
    16         v.clear();
    17         FOR(i,0,n-1)
    18         {
    19             sc(tmp);//这里不能直接是v.push_back(sc(tmp)) 会有问题
    20             v.push_back(tmp);
    21         }
    22         sort(v.begin(), v.end());
    23         int a = 0;
    24 //        vector<int>::iterator it;
    25 //        for(it=v.begin();it!=v.end();it++)
    26 //        cout<<*it<<endl;
    27         while(a < n-1)
    28         {
    29             sum += v[a] + v[a+1];
    30 //            cout << sum << endl;
    31             v[a+1] += v[a];
    32             FOR(j,a+1,n-2)
    33             {
    34                 if(v[j] <= v[j+1])
    35                     break;
    36                 else
    37                     swap(v[j], v[j+1]);
    38             }
    39             a++;
    40         }
    41         pf(sum);
    42     }
    43     return 0;
    44 }
    View Code

    主要是对于动态数组vector的用法

    1 基本操作

    (1)头文件#include<vector>.

    (2)创建vector对象,vector<int> vec;

    (3)尾部插入数字:vec.push_back(a);

    (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

    (5)使用迭代器访问元素.

    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();it++)
        cout<<*it<<endl;

    (6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

    (7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

    vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

    (8)向量大小:vec.size();

    (9)清空:vec.clear();

     2  算法

    (1) 使用reverse将元素翻转:需要头文件#include<algorithm>

    reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,

    一般后一个都不包含.)

    (2)使用sort排序:需要头文件#include<algorithm>,

    sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

    可以通过重写排序比较函数按照降序比较,如下:

    定义排序比较函数:

    bool Comp(const int &a,const int &b)
    {
        return a>b;
    }
    调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。

    3 当然,这道题目还可以使用优先队列来解决(掌握可能有困难):

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <queue>
     4 #include <vector>
     5 #define sc(x)    scanf("%d",&x)
     6 #define pf(x)    printf("%d
    ",x)
     7 #define FOR(i,b,e)    for(int i=b;i<N;i++)
     8 using namespace std;
     9 struct cmp
    10 {
    11     bool operator () (int x,int y)
    12     {
    13         return x > y;//小的优先级高
    14     }
    15 };
    16 priority_queue<int,vector<int>,cmp> q;
    17 int N;
    18 int tmp, sum, ans;
    19 int main()
    20 {
    21     while(~sc(N),N)
    22     {
    23         ans = 0;
    24         FOR(i,0,N)
    25         {
    26             sc(tmp);
    27             q.push(tmp);
    28         }
    29         while(true)
    30         {
    31             int a = q.top();
    32             q.pop();
    33             int b = q.top();
    34             q.pop();
    35             sum = (a + b);
    36             ans += sum;
    37             if(q.empty())
    38                 break;
    39             q.push(sum);
    40         }
    41         pf(ans);
    42 
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    ant实践总结
    Ubuntu安装JDK和Eclipse
    Xp下安装Ubuntu
    [Hadoop] 传智播客新版Hadoop视频教程 段海涛老师Hadoop八天完全攻克Hadoop视频教程 Hadoop开发
    Ctypes简单应用以及PyQt5等简单使用过程中遇到的部分问题
    python初探:关于闭包
    利用Nginx+Frp搭建HTTP正向代理
    C#发送邮件时提示:“不允许使用邮箱名称。服务器响应为:”的错误解决办法
    提倡IT从业人员终身学习
    打算在博客园安家了
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4392400.html
Copyright © 2011-2022 走看看