本来计划完成三道题的,三道都是比较水的题目。。。可是,,最后只做出一道,唉~~~
第一道:
一开始以为是求LIS,懒得打LIS所以百度直接copy,可是最后input的时候发现结果不一样,再次看题目才发现是求连续最长的递增子序列。。。这更简单,直接暴力就可以。
第二道:
求一共有多少对ai+aj=2^x。刚开始直接用O(N^2)的方法+判断一个数的二进制里1的个数,但是超时了,后来百度一下判断一个数是否为2的次幂的快速方法,找到了就是判断(x&(x-1)==0,成立即为2的次幂,提交还是超时了,,一直想不明白3s都超时,一直对时间都没什么概念的,,,唉,,,后来直接看第三道题先,最后没有想到方法,看大神的代码真的好短,好精简,好厉害。,。。。几行就搞掂了,,自己的逻辑思维真的不行,,最优的方法也是n^2,但是内循环是2的次幂,一直担心数太大所以没考虑循环2的次幂,还是做的太少。首先用map统计每个数出现的次数。每输入一个数,就统计map[1LL<<j-x]的个数,然后在map[x]++,刚开始没想明白,后来仔细想了想,真的好厉害,这样都想得到,get~~~~一直都不会用map,set。。。。也是一大诟病~~~
#include<cstdio>
#include<iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
#define N 100100
typedef long long ll;
ll a[N],dp[N],x;
set<ll> p;
map<ll,ll> f;
int n;
int main() {
ll k=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
cin>>x;
for(int j=0;j<32;j++)
{
k+=f[(1LL<<j)-x];
}
f[x]++;
}
cout<<k<<endl;
}
给出n个城市,m个信号塔,求出信号塔最小射程使得每个城市都接受到信号。。。其实自己已经想到方法,但是一直卡在第三个测试数据,一直想不出哪里有bug,后来看数据才发现自己初心大意了,初设最小最大的时候不够极限,inf设太小
#include<cstdio>
#include<iostream>
#include <algorithm>
using namespace std;
#define N 100100
typedef long long ll;
#define INF 9000000010
int n,m;
ll a[N],b[N];
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(scanf("%d%d",&n,&m)!=EOF) {
for(int i=0; i<n; i++)
scanf("%I64d",&a[i]);
b[0]=-INF;
b[m+1]=INF;
for(int i=1; i<=m; i++)
scanf("%I64d",&b[i]);
ll ans=0;
for(int i=0; i<n; i++) {
int t=upper_bound(b,b+m+2,a[i])-b;
//cout<<a[i]<<" "<<t<<endl;
ans=max(ans,min(abs(b[t]-a[i]),abs(b[t-1]-a[i])));
}
printf("%I64d\n",ans);
}
}加油~!!!!
本文分享了作者在ACM竞赛中解决三道算法题的经历,包括求最长连续递增子序列、寻找特定数对及确定信号塔最小覆盖范围等问题,并介绍了使用暴力法、优化时间复杂度以及利用数据结构等技巧。
1312

被折叠的 条评论
为什么被折叠?



