#include<iostream>usingnamespace std;intmain(){int n, m;
cin >> n >> m;double ret =1.0;for(int i =0; i < m; i++){
ret *=0.8;}for(int i =0; i < n - m; i++){
ret *=0.2;}for(int i = n; i >= n - m +1; i--){
ret *= i;}for(int i = m; i >=2; i--){
ret /= i;}printf("%.4lf", ret);return0;}
// 解法⼀:排序 + ⼆分#include<iostream>#include<algorithm>usingnamespace std;constint N =2e5+10;intmain(){int n, l, r;
cin >> n >> l >> r;int arr[N];for(int i =1; i <= n; i++){
cin >> arr[i];}sort(arr +1, arr + n +1);longlong ret =0;for(int i =2; i <= n; i++){int L, R;// 找左端点int left =1;int right = i -1;while(left < right){int mid =(right + left)/2;if(arr[mid]>= arr[i]- r){
right = mid;}else{
left = mid +1;}}if(arr[left]>= arr[i]- r){
L = left;}else{
L = left +1;}// 找右端点
left =1;
right = i -1;while(left < right){int mid =(right + left +1)/2;if(arr[mid]<= arr[i]- l){
left = mid;}else{
right = mid -1;}}if(arr[left]<= arr[i]- l){
R = left;}else{
R = left -1;}if(R >= L){
ret += R - L +1;}}
cout << ret << endl;return0;}// 解法⼆:排序 + 前缀和 + 滑动窗⼝#include<iostream>#include<algorithm>usingnamespace std;constint N =2e5+10;int n, l, r;int arr[N];// 找出差值在 [0, x] 之间⼀共有多少对longlongfind(int x){int left =0, right =0;longlong ret =0;while(right < n){while(arr[right]- arr[left]> x){
left++;}
ret += right - left;
right++;}return ret;}intmain(){
cin >> n >> l >> r;for(int i =0; i < n; i++) cin >> arr[i];sort(arr, arr + n);
cout <<find(r)-find(l -1)<< endl;return0;}
#include<iostream>usingnamespace std;constint MOD =1e9+7;intmain(){int n =0;
cin >> n;int x =1;int y =2;for(int i =2; i <= n; i++){int xx = x, yy = y;
x =(2* yy +1)% MOD;
y =((2* yy)% MOD +2+ xx)% MOD;}
cout << x <<" "<< y << endl;return0;}
classSolution{public:intminDifference(vector<int>& a){sort(a.begin(), a.end());longlong ret =1e16+10;;for(int i =1; i < a.size(); i++){
ret =min(ret,(longlong)a[i]- a[i -1]);}return ret;}};
2.2 kotori和素因子(DFS)
题目链接: kotori和素因子
题目描述:
解法:
算法思路:递归型枚举所有的情况。
C++ 算法代码:
#include<iostream>#include<cmath>usingnamespace std;constint N =15, M =1010;int n =0;int arr[N]={0};bool use[M];// 记录路径中⽤了哪些值int path;// 记录当前路径中所有元素的和int ret =0x3f3f3f3f;// 统计最终结果boolisPrim(int x){if(x <=1){returnfalse;}for(int i =2; i <=sqrt(x); i++){if(x % i ==0){returnfalse;}}returntrue;}voiddfs(int pos){if(pos == n){
ret =min(ret, path);}for(int i =2; i <= arr[pos]; i++){if(arr[pos]% i ==0&&isPrim(i)&&!use[i]){
path += i;
use[i]=true;dfs(pos +1);// 回溯 - 恢复现场
path -= i;
use[i]=false;}}}intmain(){
cin >> n;for(int i =0; i < n; i++){
cin >> arr[i];}dfs(0);if(ret ==0x3f3f3f3f){
cout <<-1<< endl;}else{
cout << ret << endl;}return0;}
#include<iostream>usingnamespace std;constint N =1e6+10;intmain(){int n =0;
string s;
cin >> n >> s;char dp[N];// dp[i] 表⽰:⻓度为 i 的所有的⼦序列中,最⼩的末尾是多少int ret =0;for(int i =0; i < n; i++){char ch = s[i];if(ret ==0|| dp[ret]<= ch){
dp[++ret]= ch;}else{// ⼆分出 ch 应该放的位置int left =1;int right = ret;while(left < right){int mid =(left + right)/2;if(dp[mid]> ch){
right = mid;}else{
left = mid +1;}}
dp[left]= ch;}}
cout << n - ret << endl;return0;}
#include<iostream>usingnamespace std;constint N =2e5+10;int n;int arr[N];intmain(){
cin >> n;for(int i =0; i < n; i++){
cin >> arr[i];}int ret =1;int left =0;while(left < n){int right = left;while(right +1< n && arr[right +1]- arr[right]<=8){
right++;}
ret =max(ret, right - left +1);
left = right +1;}
cout << ret << endl;return0;}
#include<iostream>#include<algorithm>usingnamespace std;constint N =2e5+10;intmain(){int n, x;
cin >> n >> x;int arr[N];for(int i =1; i <= n; i++){
cin >> arr[i];}sort(arr +1, arr + n +1);longlong ret =0;int index =max(0, n - x);
ret += arr[index]* x;for(int i = index +1; i <= n; i++){
ret += arr[i]- arr[index];}
cout << ret << endl;return0;}
classSolution{public:inttrap(vector<int>& height){int n = height.size();
vector<int>left(n);
vector<int>right(n);
left[0]= height[0];for(int i =1; i < n; i++){
left[i]=max(left[i -1], height[i]);}
right[n -1]= height[n -1];for(int i = n -2; i >=0; i--){
right[i]=max(right[i +1], height[i]);}int ret =0;for(int i =1; i < n -1; i++){
ret +=min(left[i], right[i])- height[i];}return ret;}};
#include<iostream>usingnamespace std;intmain(){int n, m, a;
cin >> n >> m;int sum =0;for(int i =0; i < n - m; i++){
cin >> a;
sum += a;}printf("%.5lf %.5lf\n",(sum + m)*1.0/ n,(sum + m *5)*1.0/ n);return0;}
#include<iostream>#include<algorithm>usingnamespace std;constint N =1e5+10;longlong n, k;longlong arr[N];longlong sum[N]={0};// 前缀和数组longlongcal(int l,int r){int mid =(l + r)/2;return(mid - l - r + mid)* arr[mid]-(sum[mid -1]- sum[l -1])+(sum[r]- sum[mid]);}intmain(){
cin >> n >> k;for(int i =1; i <= n; i++){
cin >> arr[i];}sort(arr +1, arr + n +1);for(int i =1; i <= n; i++){
sum[i]= sum[i -1]+ arr[i];}int left =1;int right =1;int ret =1;while(right <= n){longlong cost =cal(left, right);while(cost > k){
left++;
cost =cal(left, right);}
ret =max(ret, right - left +1);
right++;}
cout << ret << endl;return0;}