codeforces 1151 D

SM的水题。

codeforces 1151D

当时写对了,因为第一题卡了,,然后这题就没细想,原来是没开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 }
原文地址:https://www.cnblogs.com/jrfr/p/10754157.html