2020牛客国庆集训派对day3Leftbest

    科技2022-07-11  105

    思路

    将数据存在容器vector中(方便插入排序) 利用函数lower_bound()二分快速查找应该插入的位置插入进行排序及大于当前数的最小数进行求和。

    T了几发 一开始用的for()查找应该插入的位置,和sort()排序 第一次用函数lower_bound() wa了几发 因为可能有相等的数,而lower_bound()是二分查找>=的数

    #include<bits/stdc++.h> using namespace std; #define ll long long inline ll read() { char c = getchar(); ll x = 0, f = 1; while (c < '0' || c > '9') { if (c == '-')f = -1; c = getchar(); } while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); } return x * f; } int s; vector<int> q; ll ans=0; int main() { int n; n=read(); s=read(); q.push_back(0); q.push_back(s); for(int i=2;i<=n;i++) { s=read(); if(s>=q[i-1])q.push_back(s);//大于之前输入的数直接q末尾插入ans+=0 else { vector<int>::iterator t=lower_bound(q.begin() ,q.end() , s);//在容器中寻找>=s的 while(*t<=s)t++;//寻找>s的 ans+=*t; q.insert(t,s);//插入s排序 //printf("%d : %d ",i,*t); //for(int j=1;j<=i-1;j++) //{ // if(q[j]>s){ans+=q[j];q.insert(q.begin()+j,s);break;} // if(q[i-j]<=s){ans+=q[i-j+1];q.insert(q.begin()+i-j+1,s);break;} // } //for(vector<int>::iterator it=q.begin();it!=q.end();it++){cout<<*it<<" ";} //printf("\n");//遍历容器检查排序是否正确 } printf("%lld\n",ans); return 0; }
    Processed: 0.029, SQL: 8