京东笔试
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 */ }