Educational Codeforces Round 15 7.29

来源:互联网 发布:丁丁装修软件 编辑:程序博客网 时间:2024/06/11 08:04

本来计划完成三道题的,三道都是比较水的题目。。。可是,,最后只做出一道,唉~~~

第一道:

一开始以为是求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 100100typedef 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 100100typedef long long ll;#define INF 9000000010int n,m;ll a[N],b[N];int main() {#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifwhile(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);}}


加油~!!!!

0 0
原创粉丝点击