京东笔试
70%,0%,0%
/*
差值不能大于k的数对相乘之和,数对用一次就删了,70%
*/
#include <bits/stdc++.h>
#include <functional>
using namespace std;
int main() {
int n,k;
cin>>n>>k;
vector<int>arr(n);
for(auto& x:arr)
cin>>x;
long long sum=0;
sort(arr.begin(),arr.end(),greater<int>());
for(int i=0;i<n-1;i++)
{
if(arr[i]-arr[i+1]<k)
{
sum+=arr[i]*arr[i+1];
i++;
}
}
cout<<sum;
}// 4 1 1 1
/*
走地砖,一次一步或两步,最少代价(超时,0%)
*/
#include <bits/stdc++.h>
using namespace std;
const int inf=1e9;
int main() {
int n;
cin>>n;
vector<int> arr(n);
for(auto& x:arr)
cin>>x;
int ret=inf;
//dfs:左为走一步,走为走两步
//当走两步走超了,那这条分支就去掉,提前判断
function<void(int,int)> dfs=[&](int i,int cost){
if(i==n){ret=ret>cost?cost:ret;return;}
dfs(i+1,cost+arr[i+1]);
if(i+2<=n)
{
dfs(i+2,cost+arr[i+2]);
}
};
dfs(0,0);
cout<<ret;
}
/*
子数组权值,a1*1+a2*2+a3*3 (不会)
*/
#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
int sum = 0;
int sum_subarr(vector<int>& subarr) {
int s = 0;
for (int i = 0; i < subarr.size(); i++) {
cout << subarr[i] << " ";
s += (subarr[i] * (i + 1));
s %= inf;
}
cout << endl;
return s;
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (auto& x : arr)
cin >> x;
vector<int> tmp;//统计每一个数应该被加的次数
function<void(int, int, vector<int>&)> dfs = [&](int i, int d,
vector<int>& tmp) {
if (i == n) {
sum += sum_subarr(tmp);
sum %= inf;
return;
}
if (d == 0) {//第一层扩展全部,其余层只扩展一个后面元素
for (; i < n; i++) {
tmp.push_back(arr[i]);
//cout<<i<<" "<<sum<<" tmp:"<<tmp.size()<<endl;
dfs(i + 1, d + 1, tmp);
tmp.pop_back();
}
} else {
if (i + 1 < n) {
tmp.push_back(arr[i + 1]);
dfs(i + 1, d, tmp);
tmp.pop_back();
}
}
};
dfs(0, 0, tmp);
//cout << sum;
/*
第一个数被加了3次
第二个数被作为2号,加了两次相当于4次,还有自己1次 4+1
第三个数,被当做2一次,相当于2次,被当做3一次,相当于3, 2+3
*/
/* 0
1 2 3
2 3
3
*/
}
