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 }