4 条题解
-
1
c++11思路: 这题其实很简单,如果刷过力扣的应该一眼丁真,就是力扣第一题,用哈希表去映射每个数组
#include <bits/stdc++.h> using namespace std; int main(){ int N,C; cin>>N>>C; vector <int> v(N,0); unordered_map <int,int> mp;//哈希表 int res = 0; int Max = INT_MIN; for(int i = 0;i<N;i++){ cin>>v[i]; mp[v[i]]++; if(Max<=v[i]) Max = v[i]; } for(int i = 1;i<=Max;i++){ if(mp[i-C]!=0) res += mp[i-C];//遍历每个数组,如果存在这个数,就是直接加上存在这个数的个数就OK了 } cout<<res; } -
1
这道题好像因为题面过于简单误导大家了,如果以后遇到TLE且没有新思路的话,建议先跳过,很可能是卡某些算法。
这道题的正解应该是两遍二分,把每个 ai 作为减数,对应的被减数应该是唯一的,第一遍二分找第一次出现的被减数,第二遍找最后一次出现的被减数,可得到答案。时间复杂度应该是O(nlogn)。有人用桶的方式过了,其实是因为数据没有给到特别大,还是建议大家优先使用二分,这里不再赘述。
#include<bits/stdc++.h> #define int long long using namespace std; signed main() { int n,k; cin >> n >> k; int ai[n+5]={0}; for(int i=1;i<=n;i++) { cin >> ai[i]; } int sum=0; for(int i=1;i<=n;i++) { int tar=ai[i]+k; int l=i-1,r=n+1; while(l+1!=r) { int mid=(l+r)/2; if(ai[mid]<tar) { l=mid; } else { r=mid; } } int ll=i-1,rr=n+1; while(ll+1!=rr) { int mid=(ll+rr)/2; if(ai[mid]>tar) { rr=mid; } else { ll=mid; } } sum+=(ll-r+1); } cout << sum << endl; } -
0
#include<iostream> #include<vector> using namespace std; int main() { int n,c; cin>>n>>c; vector<int> nums(1000001); vector<int> haxi(10000001); for(int i=0;i<n;i++) { cin>>nums[i]; haxi[nums[i]]++; nums[i]-=c; } int ans=0; for(int i=0;i<n;i++) { if(nums[i]>0) { ans+=haxi[nums[i]]; haxi[nums[i]]=0; } } cout<<ans; return 0; }
- 1
信息
- ID
- 1153
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 453
- 已通过
- 47
- 上传者