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 }

 

posted on 2017-05-27 17:03  whz2002  阅读(125)  评论(0编辑  收藏  举报