codeforces 813

A

n 道题目  然后n到题目完成所需要的时间

m

然后m 个可以交题目的时间  一个时间可以交任意个完成的题目 

求 最少提交的时间

求最小时间就可以了

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<set>
#include<iterator>
#include<iostream>
#include<math.h>
#include<queue>
#include<vector>

using namespace std;

#define ll long long
#define inf 1000000007
#define MAXN 1010

struct node
{
    int l,r;
}z[MAXN];

int main()
{
    int n;
    int sum=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        sum=sum+a;
    }
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&z[i].l,&z[i].r);
        if(z[i].l<=sum&&sum<=z[i].r)
        {
             printf("%d\n",sum);
             return 0;
        }
        else if(z[i].l>sum)
        {
            printf("%d\n",z[i].l);
            return 0;
        }
    }
    printf("-1\n");
    return 0;
}
View Code

B

n =x^a+y^b

给你  x y  l r

问 l ~r  里最长连续的段  数都不能被表示出来

x,y >=2

log 级别  求出所有可能的数 然后n^2 求出l ~ r 里的数 没有就是都好的 

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<set>
#include<iterator>
#include<iostream>
#include<math.h>
#include<queue>
#include<vector>

using namespace std;

#define ll __int64
#define inf 1000000007
#define MAXN 110100

ll z[MAXN];
ll a[100];
ll b[100];

int main()
{
    ll x,y,l,r;
    scanf("%I64d%I64d%I64d%I64d",&x,&y,&l,&r);
    ll mx=0;
    a[0]=1;
    b[0]=1;
    int cn1,cn2;
    cn1=cn2=1;
    ll d=r;

    for(int i=1;;i++)
    {
        ll c=d/x;
        if(c>0)
        {
            a[cn1]=a[cn1-1]*x;
            d=d/x;
            cn1++;
        }
        else
        {
            break;
        }
    }
    d=r;
    for(int i=1;;i++)
    {
        ll c=d/y;
        if(c>0)
        {
            b[cn2]=b[cn2-1]*y;
            d=d/y;
            cn2++;
        }
        else
        {
            break;
        }
    }
    int cnt=0;
    for(int i=0;i<cn1;i++)
    {
        for(int j=0;j<cn2;j++)
        {
            if((a[i]+b[j])>=l&&(a[i]+b[j])<=r)
            {
              //  printf("%lld\n",a[i]+b[j]);
                z[cnt++]=a[i]+b[j];
            }
        }
    }
    sort(z,z+cnt);
   // for(int i=0;i<cnt;i++)
   //     printf("%lld ",z[i]);
   // printf("\n");
    if(cnt>0)
    {
         if(z[0]-l>mx)
            mx=z[0]-l;
        if(r-z[cnt-1]>mx)
            mx=r-z[cnt-1];
        for(int i=1;i<cnt;i++)
            mx=max(mx,z[i]-z[i-1]-1);
    }
    else
        mx=r-l+1;
    printf("%I64d\n",mx);
    return 0;
}
View Code

C

n 个 点 你在m

然后n-1 条边

1 是根  求 1追到你 所需要最少时间 

dis1[u]>dis2[u]   mx=max(mx,dis1[u]*2)

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<set>
#include<iterator>
#include<iostream>
#include<math.h>
#include<queue>
#include<vector>

using namespace std;

#define ll __int64
#define inf 1000000007
#define MAXN 210100

int dis1[MAXN],dis2[MAXN];

struct node
{
    int u,v,next;
}edge[MAXN*2];
int head[MAXN];
int cnt;
void add(int u,int v)
{
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs1(int u,int fa)
{
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(v==fa)
            continue;
        dis1[v]=dis1[u]+1;
        dfs1(v,u);
    }
}

void dfs2(int u,int fa)
{
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(v==fa)
            continue;
        dis2[v]=dis2[u]+1;
        dfs2(v,u);
    }
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(head,-1,sizeof(head));
    cnt=0;
    for(int i=1;i<n;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    dfs1(1,-1);
    dfs2(m,-1);
    int mx=0;
    for(int i=1;i<=n;i++)
        if(dis2[i]<dis1[i])
            mx=max(mx,dis1[i]*2);
    printf("%d\n",mx);
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/cherryMJY/p/6953065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值