SM的水题。
当时写对了,因为第一题卡了,,然后这题就没细想,原来是没开longlong。
题意:n个位置每个位置有a和b,让sum=(每个点的左面的点的数量*a+右面点的数量*b)*n最小
理解:就是个小贪心,注意下开longlong就OK了
1 #include <iostream>
2 #include <cmath>
3 #include <cstdio>
4 #include <cstring>
5 #include <string>
6 #include <map>
7 #include <iomanip>
8 #include <algorithm>
9 #include <queue>
10 #include <stack>
11 #include <set>
12 #include <vector>
13 //const int maxn = 1e5+5;
14 #define ll long long
15 #define MAX INT_MAX
16 #define FOR(i,a,b) for( ll i = a;i <= b;++i)
17 //#define MOD 142857
18 using namespace std;
19 ll n,ans;
20 struct node
21 {
22 ll a, b;
23 }v[110000];
24 bool cmp(node x,node y)
25 {
26 if(x.a-x.b==y.a-y.b)
27 {
28 if(x.a==y.a)
29 {
30 return x.b<y.b;
31 }
32 else return x.a>y.a;
33 }
34 return x.a-x.b>y.a-y.b;
35 }
36 int main()
37 {
38 // freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
39 // freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
40 cin>>n;
41 for(ll i=1;i<=n;++i)
42 {
43 cin>>v[i].a>>v[i].b;
44 }
45 sort (v+1,v+1+n,cmp);
46 FOR(i,1,n)
47 {
48 ans=ans+(v[i].a)*(i-1)+(v[i].b)*(n-i);
49 }
50 cout<<ans;
51 }
来源:oschina
链接:https://my.oschina.net/u/4305544/blog/3563559