b 排序+貪心
首先想到,選擇的mk個數字一定是最大的,因為無論如何分組,總有區間是包含前mk大的數字的。
然後是分組,分組的情況不是唯一的(開始的時候分組一直和樣例不一樣,改了好多次)後來發現分組可以不一樣qaq
#include#include#include#include#include#include#include#includeusing namespace std;
struct node
a[200100];
int n,m,k;
long long sum;
bool cmp1(node k,node l)
bool cmp2(node k,node l)
int main()
sort(a,a + n,cmp1);
sum = 0;
for(int i = 0;i < m * k; ++i) sum += a[i].s;
printf("%lld\n",sum);
sort(a,a + m * k,cmp2);
int t = m - 1;
for(int i = 1;i < k - 1; ++i)
printf("%d\n",a[t].num);
return 0;
}
c 數學 最大質因子
之前做過乙個十進位制下求l到r中有多少個0的題,當時是考慮到10 = 2 * 5,所以必須要有1個5 和乙個 2 才會有1個0,因為l到r 中2 肯定比 5 多,就是看l 到 r裡面的數字i,裡面含有多少個數字5
那麼這個題呢,把10 換成了b ,其實也一樣,只要分解質因數b = p1 ^a1* p2^a1 * p3 ^a3…*pn ^an,找到n!裡面p1、p2、… pn裡面出現的次數c1 c2 c3…cn
0的個數就是min(c1/a1,c2/a2,…,cn/an)
d 區間dp
(1)將[i…j]染成i處的顏色或者j處的顏色所用次數最少
(2)如果a[i] 與 a[i + 1] 顏色相等,dp[i][j] 可以由 dp[i + 1][j] 得到,a[j]與a[j - 1]相等同理
(3)如果a[i] == a[j], f[i][j] 可以由 f[i + 1][j - 1] + 1 得到
(4)以上都不滿足,f[i][j] 可以由 f[i + 1][j] + 1 或 f[i][j - 1] 得到
#include#include#include#include#include#include#include#includeusing namespace std;
int a[5010];
int f[5010][5010];
int n;
int main()
}printf("%d\n",f[1][n]);
return 0;
}