Educational Codeforces Round 15(简单题)

A. Maximum Increase
题意:
给出一个数列(n<100000),问最长连续上升子序列?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+9;
int a[N];
int main()
{
    int n;scanf("%d",&n);
    int maxn=1;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    a[0]=0;
    int t=0;
    for(int i=1;i<=n;i++){
        if(a[i]>a[i-1])t++;
        else maxn=max(maxn,t),t=1;
    }
    maxn=max(maxn,t);
    printf("%d\n",maxn);
    return 0;
}

B. Powers of Two
题目:
给一个数列(n<100000),问符合ai+aj是2的幂次(i< j)的有几对?

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+9;
int a[N];
int main()
{
    int n;scanf("%d",&n);
    map<int,int>mp;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        mp[a[i]]++;
    }
    ll ans=0;
    for(int i=0;i<n;i++){
        mp[a[i]]--;
        for(int j=0;j<32;j++){
            int x=(1<<j)-a[i];
            ans+=mp[x];
        }
    }
    printf("%I64d\n",ans);
    return 0;
}

C. Cellular Network
题意:
有n个城市,城市位置是ai,有m个信号塔,在bi,距离信号塔r范围之内的城市可以被覆盖,问覆盖所有城市的最小r是多少?a和b序列都是不下降序列。
分析:
二分答案,然后判断r是否可以覆盖所有城市。
在判断某个城市是否可以被覆盖的时候,二分找出离他最近的信号塔,然后判断即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+9;
int a[N];
int n,m,b[N];
bool ismax(int x)
{
    for(int i=0;i<n;i++){
        int k=lower_bound(b,b+m,a[i])-b;
        //cout<<k<<endl;
        if(k>0&&b[k-1]+x>=a[i]&&b[k-1]-x<=a[i])continue;
        if(k<m-1&&b[k+1]+x>=a[i]&&b[k+1]-x<=a[i])continue;
        if(k>=0&&k<m&&b[k]+x>=a[i]&&b[k]-x<=a[i])continue;
        return false;
    }
    return true;
}

int main()
{
    //freopen("f.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<m;i++)scanf("%d",&b[i]);

    int l=0,r=2e9;
    while(l<r){
        int m=l+(r-l)/2;
        if(ismax(m))r=m;
        else l=m+1;
    }
    printf("%d\n",l);
    return 0;
}

D. Road to Post Office
题意:
一个人开车去公司,距离是d公里,每次开车可以行使k公里后就坏了,修车需要t秒,开车行驶一公里需要a秒,走路需要b秒,a< b。问到公司需要的最少时间?
分析:
因为a< b,所以刚开始一定是开车的,加入k公里后没到公司,那么就需要决策是否修车或者直接走路了。
这题要注意用long long。中间自己在这里坑了一次。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int INF=0x3f3f3f3f;
const int N=1e5+9;
ll d,k,a,b,t;
int main()
{
    cin>>d>>k>>a>>b>>t;
    double x=1.0*t/k+a;
    ll ans=0,ans0=0;
     //走路
        ll kk=k,dd=d;
        while(dd>0&&kk>0)ans0+=a,dd--,kk--;
        ans0+=dd*b;
     //继续开车
    kk=k;
    while(d>0&&kk>0)ans+=a,d--,kk--;
    ll n=d/k;
    ans+=n*t+a*n*k;
    n=d%k; //剩下最后一段距离,选择开车还是走路?
    ll a1=b*n; 
    ll a2=t+n*a;
    printf("%I64d\n",min(ans0,min(a1,a2)+ans));
    return 0;
}

E. Analysis of Pathes in Functional Graph
比赛的时候毫无思路,另写一篇吧QAQ

posted @ 2016-07-31 15:20  HARD_UNDERSTAND  阅读(166)  评论(0编辑  收藏  举报