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 }