題目連接:https://codeforces.com/problemset/problem/1165/Enode
題目大意:
n表明n個數,而後輸入a數組,a數組有n個,b數組有n個。而後你能夠對b數組裏面的數任意排序,最終目的是使得題目中的表達式的值儘量的小。c++
具體思路:數組
貪心,假設咱們當前n==2.a數組分別是 1 5 ,b數組分別是 4 5 。咱們若是讓表達式儘量小,就儘可能讓大的數去乘一個小的數,而後讓一個小的數去乘一個大的數,這樣得到的結果url
是儘量的小的。而後對於題目中表達式的求解,經過打表能發現,每一個位置的相乘次數是固定的,也就是一個以中心對稱,單邊單調遞減的。spa
AC代碼:.net
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll unsigned long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 2e5+100; 6 const ll mod = 998244353 ; 7 struct node 8 { 9 ll num; 10 ll id; 11 node() {} 12 node(ll xx,ll yy) 13 { 14 num=xx,id=yy; 15 } 16 bool friend operator < (node t1,node t2) 17 { 18 return t1.num<t2.num; 19 } 20 } a[maxn],b[maxn]; 21 ll aa[maxn],bb[maxn],c[maxn]; 22 ll vis[maxn]; 23 bool cmp(node t1,node t2) 24 { 25 return t1.id<t2.id; 26 } 27 bool cmp1(ll t1,ll t2){ 28 return t1<t2; 29 } 30 bool cmp2(ll t1,ll t2){ 31 return t1>t2; 32 } 33 int main() 34 { 35 ll n; 36 scanf("%lld",&n); 37 for(ll i=1; i<=n; i++) 38 { 39 scanf("%lld",&a[i].num); 40 a[i].id=i; 41 aa[i]=a[i].num; 42 } 43 for(ll i=1; i<=n; i++) 44 { 45 scanf("%lld",&b[i].num); 46 b[i].id=i; 47 bb[i]=b[i].num; 48 } 49 // sort(a+1,a+n+1); 50 // sort(b+1,b+n+1); 51 // for(ll i=1; i<=n; i++) 52 // { 53 // c[a[i].id]=b[n-i+1].num; 54 // } 55 // for(ll i=1; i<=n; i++) 56 // { 57 // bb[i]=c[i]; 58 // } 59 // ll sum=0; 60 // for(int i=1; i<=n; i++) 61 // { 62 // for(int j=i; j<=n; j++) 63 // { 64 // ll tmp=0; 65 // for(int k=i; k<=j; k++) 66 // { 67 // vis[k]++; 68 // tmp=tmp+aa[k]*bb[k]%mod; 69 // tmp%=mod; 70 // } 71 // tmp%=mod; 72 // sum+=tmp; 73 // sum%=mod; 74 // } 75 // } 76 // for(int i=1;i<=n;i++){ 77 // cout<<i<<" "<<vis[i]<<endl; 78 // } 79 // cout<<endl; 80 // memset(vis,0,sizeof(vis)); 81 ll tmp=n-2ll; 82 vis[1]=n; 83 for(ll i=2; i<=(n+1)/2; i++) 84 { 85 vis[i]=vis[i-1]+tmp; 86 tmp-=2ll; 87 } 88 for(ll i=(n+1)/2+1; i<=n; i++) 89 { 90 vis[i]=vis[n-i+1]; 91 } 92 for(int i=1; i<=n; i++) 93 { 94 aa[i]*=vis[i];// 注意這裏是aa數組先乘上出現次數再去排序,不能先排序再去相乘 ,不然有可能不是最優結果 95 } 96 sort(aa+1,aa+n+1,cmp1);
97 sort(bb+1,bb+n+1,cmp2); 98 // for(int i=1;i<=n;i++){ 99 // cout<<aa[i]<<" "; 100 // } 101 // cout<<endl; 102 // for(int i=1;i<=n;i++){ 103 // cout<<bb[i]<<" "; 104 // } 105 // cout<<endl; 106 107 ll sum=0; 108 for(ll i=1; i<=n; i++) 109 { 110 sum= sum+(aa[i]%mod*bb[i]%mod)%mod; 111 sum%=mod; 112 } 113 sum%=mod; 114 printf("%lld\n",sum); 115 return 0; 116 }