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; }
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; }
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; }