E. Two Arrays and Sum of Functions(貪心)

題目連接: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 }
相關文章
相關標籤/搜索