zoukankan      html  css  js  c++  java
  • 17-05-27模拟赛

    T1:读入后按身高排序,枚举每个点可以与之相邻的身高的区间,dfs统计答案。

    Code:

     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 using namespace std;
     7 int n,k,cur,ans;
     8 int a[11],pmx[11],pmn[11];
     9 bool vis[11];
    10 void dfs(int x,int step){
    11     if (step==n) {if (abs(cur-a[x])<=k) ++ans; return;}
    12     vis[x]=1;
    13     for (int i=pmn[x];i<=pmx[x];++i) if (!vis[i])dfs(i,step+1);
    14     vis[x]=0;
    15 }
    16 int main()
    17 {
    18     scanf("%d%d",&n,&k);
    19     for (int i=1;i<=n;++i) scanf("%d",&a[i]);
    20     sort(a+1,a+n+1);
    21     for (int i=1;i<=n;++i){
    22         pmx[i]=pmn[i]=i;
    23         while (pmx[i]<n&&a[pmx[i]+1]-a[i]<=k) pmx[i]++;
    24         while (pmn[i]>1&&a[i]-a[pmn[i]-1]<=k) pmn[i]--;
    25     }
    26     for (int i=1;i<=n;++i) {cur=a[i];dfs(i,1);}
    27     printf("%d",ans/n);
    28     return 0;
    29 }

    T2:二分答案,前缀和计算出每次拿的薪水,若大于二分的答案,则标记前一天。若被标记的天数(包括最后一天)大于领取的机会数,则return 0,反之return 1.

    Code:

     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<algorithm>
     7 #define MN 100005
     8 using namespace std;
     9 int sum[MN],a[MN];
    10 int n,m,l,r,ans=0;
    11 bool check (int x){
    12     int cur=0,t=0;
    13     for (int i=0;i<n;++i){
    14         if (a[i+1]>x||t>=m) return 0;
    15         if (sum[i+1]-sum[cur]>x) cur=i,t++;    
    16     }
    17     return t<m;
    18 }
    19 int main()
    20 {
    21     scanf("%d%d",&n,&m);sum[0]=0;
    22     for (int i=1;i<=n;++i) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
    23     l=0;r=sum[n];
    24     while (l<=r){
    25         int mid=(l+r)>>1;
    26         if (check(mid)) ans=mid,r=mid-1;else l=mid+1;
    27     }printf("%d",ans);
    28     return 0;
    29 }

    T3:

    令in[i]为到达i点的总方案数,out[i]为从i出发到达n点的方案数,则通过边(u,v)的方案数为in[u]*out[v],故搜索每一条边,找到该值的最大值即可。

    st[i]表示该点是否有入边。

    Code:

     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<algorithm>
     7 #define ME 50005
     8 #define MN 5005
     9 using namespace std;
    10 struct ed{
    11     int x,y;
    12 }a[ME];
    13 struct edge{
    14     int to,next;
    15 }e[ME<<1];
    16 int r[MN],h[MN],num[MN],in[MN],out[MN];
    17 bool rvis[MN],vis[MN],st[MN];
    18 int n,m,x,y,cnt=1;
    19 void ins(int *head,int x,int y){
    20     e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt;
    21 }
    22 int main()
    23 {
    24     scanf("%d%d",&n,&m);memset(st,0,sizeof(st));
    25     for (int i=1;i<=m;++i){
    26         scanf("%d%d",&a[i].x,&a[i].y);st[a[i].y]=1;
    27         ins(h,a[i].x,a[i].y),ins(r,a[i].y,a[i].x);
    28     }
    29     for (int i=1;i<=n;++i){
    30         in[i]=st[i]?0:1;
    31         for (int j=r[i];j;j=e[j].next) in[i]+=in[e[j].to];
    32     }out[n]=1;
    33     for (int i=n;i;--i){
    34         for (int j=h[i];j;j=e[j].next) out[i]+=out[e[j].to];
    35     }int mx=0;
    36     for (int i=1;i<=m;++i) mx=max(in[a[i].x]*out[a[i].y],mx);
    37     printf("%d",mx);return 0;
    38 }
  • 相关阅读:
    关于在函数中返回动态的内存
    C与C++中的const
    strcat函数的坑点
    面试题30.最小的k个数
    面试题29.数组中出现次数超过一半的数字
    面试题28.字符串的排列
    面试题27.二叉搜索树与双向链表
    C++中构造函数初始化成员列表总结
    Oracle merge into
    检索 COM 类工厂中 CLSID 解决办法
  • 原文地址:https://www.cnblogs.com/codingutopia/p/test170527.html
Copyright © 2011-2022 走看看