e,不知道标题
2024-04-30 21:08:21
发布于:浙江
18阅读
0回复
0点赞
ACGO有两道一道一模一样的题
传送门1,传送门2,某谷传送门
直接启动!
这题我先在洛谷上刷的,讲述一下我的分数历程吧
76(两版)——>92——>100
76分思路第一款:
朴实无华,输入后sort排序一遍,之后for嵌套查可用的数,唯一的优化就是加了个flag,但区别不大:(
结果1.20s完美地T了3个点
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int ans=0,n, c, a[200005];
cin >> n >> c;
for (int i = 1; i <= n; i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
int x=c+a[i];
bool flag=false;
for(int j=i+1;j<=n;j++){
if(a[j]==x){
if(flag=false)flag=true;
ans++;
}
else if(flag==true)break;
}
}
cout<<ans<<endl;
return 0;
}
76分第二款
我看了看二分的标签,加了个lower_bound(一个二分函数,algorithm库的)给上面的内层循环里的j找值
扩展:lower_bound底层实现(懒得写,顺手借的csdn里叫am brother的大佬的 传送门
int upper_bound(vector<int>& nums, int x) { //求大于等于指定数的最小坐标
int left = 0,right = nums.size() - 1;
while (left <= right) {
int mid = left +(right - left) / 2;
if (x >= nums[mid]) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}
第二遍代码:
#include<bits/stdc++.h>
using namespace std;
int ans=0,n, c, a[200005];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> c;
for (int i = 1; i <= n; i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
int x=c+a[i];
bool flag=false;
for(int j=lower_bound(a+i+1,a+n+1,x)-a;j<=n;j++){
if(a[j]==x){
if(flag=false)flag=true;
ans++;
}
else if(flag==true)break;
}
}
cout<<ans<<endl;
return 0;
}
说实话,我挺不明白这次的效率和上次差不多也T了3个点的但似乎用的空间少了(更不理解了)
92分款:
彻底改变了思路,map,启动!
我map logn的复杂度和你开玩笑?(LaTeX不知道为什么没法用,将就着看吧)
第三遍代码
#include<bits/stdc++.h>
using namespace std;
int ans=0,n, c, a[200005];
map <int,int>m;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> c;
for (int i = 1; i <= n; i++){
cin>>a[i];
m[a[i]]++;
}
for(int i=1;i<=n;i++){
ans+=m[c+a[i]];
}
cout<<ans<<endl;
return 0;
}
这版的bug就很好找了,10年编程一场空,不开longlong见祖宗,so,最后一版怎么写懂?
满分代码:
#include<bits/stdc++.h>//传统万能头
using namespace std;
long long ans=0,n, c, a[200005];
map <long long,int>m;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);//cin,cout加速
cin >> n >> c;
for (int i = 1; i <= n; i++){
cin>>a[i];
m[a[i]]++;//map记录每个数的个数
}
for(int i=1;i<=n;i++){
ans+=m[c+a[i]];//不断寻找增加
}
cout<<ans<<endl;
return 0;//完结撒花!
}
每日题外话:
三体ACGO分部等你!快来!!!
这里空空如也
有帮助,赞一个