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\n", 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\n",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

转载于:https://www.cnblogs.com/ghostTao/p/4392400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值