題目大意:
給出乙個n個數的序列,我們可以刪除m個數,然後我們要求出現次數最多並且最大的,
也就是如果出現次數最多的有多個,那就必須刪除其他的數,避免出現次數最大的有多個,然後我們要求值最大,所以我們還要盡量判斷值大的
題目思路:
首先我們先明確我們要取什麼數:1.次數最多並且值最大的;2.且最大值唯一,要把不能有多個次數相同
既然我們要取次數最多並且值最大的,如果我們取當前這個數的話,我們肯定出現次數相同還有重複的話,我們優先肯定是取最大的,但是我們又要把所有次數比他多的刪掉,因為取這個數就代表當前這個數的出現次數最多,但是我們不知道哪些比它多,我們直接遍歷的話會超限,所以我們貪心,先用map記錄下每個數出現的次數,然後我們用迭代器遍歷,按次數最多的排前,然後次數相等的把大的排後面(因為我們是按次數從大到小排的,所以我們要把前面那些次數比當前位置多的都減成比他小,但是相同次數的時候我們取值大的,所以次數相等的時候按值的公升序排)
#includeusing namespace std;
typedef long long ll;
const int maxn=100000+100;
struct node
b[maxn];
ll n,m;
mapmp;
ll a[maxn];
int cnt;
bool cmp(node q,node w)
int main()
sort(b,b+cnt,cmp);
ll sum=0;
int flag=0;
ll num;
for(int i=0;inum)}}
sum+=b[i].num;}}
if(!flag)printf("-1\n");
else printf("%lld\n",num);
}return 0;
}
free(牛客多校第四場)
free 本題可以通過常規的最短路演算法改變來得到,通過在最短路演算法中加乙個長度為k的迴圈,判斷k條路免費後的最小權值即可。include include include include include include include include include define inf 0x3f...
2019牛客多校第四場 D triples I
對於二進位制每一位上的1進行考慮,2 0 3 1 2 1 3 2 2 2 3 1 2 3 3 2 那麼我們可以想到把a轉化為二進位制,然後他 3 1的位數有cnt1個,3 2的位數有cnt2個。我們可以想到每個數字最多由2個數字組成,下面給出證明。那麼 sum a 3,如果sum 0,那麼直接乙個數...
2019牛客多校第四場 A meeting
考場上寫了一大坨樹形dp,寫的時候就感覺我這不是跟求樹的最長鏈寫的一毛一樣 然後考後看題解,果然是k個ren所連成的子樹的最長鏈的一半 可以利用反證法證明,如果在長度為d的最長鏈的中間放乙個中心,如果有另外乙個點到這個點的長度 d 1 2,那麼這個點到對面的那個點的長度大於d,所以不存在這樣乙個點。...