7.4集训模拟赛7
Posted lightyachoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.4集训模拟赛7相关的知识,希望对你有一定的参考价值。
恭喜你找到一只正在洗澡的pig,稍等一会,分析马上来
A. 侦查
题目描述
输入格式
输出格式
样例
样例输入
12 11 10 11 2 3 4 5 1 1 1 1 1 1 1 2 2 3 1 3 4 5 5 6 6 7 8 9 9 12 11 12 10 11 8 10
样例输出
8 9 10 11 12 1 2 3
Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1100; int n,m; int a[N]; int sum[N],summ[N],dfn[N],low[N]; int Time,tot,cnt,top; int x,y,g[N],head[N]; bool vis[N]; int sta[N]; struct edge{ int to; int ne; }e[N<<2]; void add(int u,int v){ e[++cnt].to = v; //e[cnt].w = w; e[cnt].ne = head[u]; head[u] = cnt; } void tarjan(int u){ dfn[u]=low[u]=++Time; vis[u]=1;sta[++top]=u; for(int i=head[u];i;i=e[i].ne){ int v = e[i].to; if(!dfn[v]){ tarjan(v); low[u] = min(low[u] , low[v]); } if(vis[v]){ low[u] = min(low[u] , dfn[v]); } } if(dfn[u]==low[u]){ tot++; //sum[tot]+=a[u]; while(sta[top+1]!=u){ int v = sta[top--]; vis[v] = 0; sum[tot]+=a[v]; summ[tot]++; g[v] = tot; } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); add(x,y); add(y,x); } for(int i=1;i<=n;i++){ if(!dfn[i])tarjan(i); } int jidi=-10,diren=-10; for(int i=1;i<=tot;i++){ jidi = max(jidi,summ[i]); diren = max(diren,sum[i]); } //printf("%d %d ",jidi,diren); for(int i=1;i<=n;i++){ if(summ[g[i]]==jidi){ for(int j=1;j<=n;j++){ if(g[j]==g[i]){ printf("%d ",j); } } break; } } printf(" "); for(int i=1;i<=n;i++){ if(sum[g[i]]==diren){ for(int j=1;j<=n;j++){ if(g[j]==g[i]){ printf("%d ",j); } } break; } } return 0; }
B. 借书
题目描述
输入格式
输出格式
样例
样例输入
6 3 5 7 1 17 13 10
样例输出
7
数据范围与提示
Code
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int n,m; int a[N]; int maxn; int gd[N]; int aa; int cnt; bool cheak(int x){ aa=0,cnt=0; for(int i=1;i<n;i++){ aa+=gd[i]; if(aa>=x){ cnt++; aa=0; } } if(cnt+1>=m){ return true; } else return false; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); maxn = max(maxn,a[i]); } sort(a+1,a+1+n); for(int i=1;i<n;i++){ gd[i] = a[i+1]-a[i]; } int l=0,r=maxn; while(l<=r){ if(r-l==1){ if(cheak(r)){ l=r; } break; } int mid = (l+r)/2; if(cheak(mid)){ l=mid; } else { r=mid; } } printf("%d",l); }
C. 搜城探宝
题目描述
输入格式
输出格式
样例
样例输入
8 4 1 2 1 3 2 4 2 5 3 6 3 7 6 8 2 5 1 4 6 1 1 10
样例输出
27
数据范围与提示
Code
#include<bits/stdc++.h> using namespace std; const int N = 50; int ls[N],rs[N],fa[N]; int n,key,a[N]; int x,y,ans; int dfs(int x,int k){ if(x==0)return 0; if(k==1)return a[x]; int now = 0; for(int i=0;i<k;i++){ now = max(dfs(ls[x],i)+dfs(rs[x],k-i-1)+a[x],now); } return now; } int main(){ scanf("%d%d",&n,&key); for(int i=1;i<=n-1;i++){ scanf("%d%d",&x,&y); if(!ls[x])ls[x] = y; else rs[x] = y; fa[y]=x; } for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } ls[n+1] = 1; for(int i=2;i<=n;i++){ rs[n+1] = i; if(ls[fa[i]]==i){ ls[fa[i]]=0; ans = max(ans,dfs(n+1,key+2)); ls[fa[i]] = i; } else { rs[fa[i]] = 0; ans = max(ans,dfs(n+1,key+2)); rs[fa[i]] = i; } } printf("%d ",ans); return 0; }
D. MM不哭
题目描述
输入格式
输出格式
样例
样例输入
4 3 2 2 5 8 6 1 8 7
样例输出
56
Code
#include<bits/stdc++.h> using namespace std; const int N = 1010; int n,v,x; int f[N][N][2]; int sum[N]; struct node{ int x; int w; }e[N]; bool cmp(node a,node b){ return a.x<b.x; } int main(){ scanf("%d%d",&n,&v); for(int i=1;i<=n;i++){ scanf("%d%d",&e[i].x,&e[i].w); } /*v = e[v].x; //printf("%d",x); sort(e+1,e+1+n,cmp); for(int i=1;i<=n;i++){ if(v==e[i].x){ v=i; } }*/ for(int i=1;i<=n;i++){ sum[i] = sum[i-1]+e[i].w; } memset(f,0x3f,sizeof(f)); f[v][v][1]=f[v][v][0] = 0; for(int l = 2;l <= n;l++){ for(int i=1;i+l-1<=n;i++){ int j = i+l-1; if(i < x-l+1)continue; //if(j>n)break; int n1=sum[i]+sum[n]-sum[j]; int n2=sum[i]+sum[n]-sum[j]; int n3=sum[i-1]+sum[n]-sum[j-1]; int n4=sum[i-1]+sum[n]-sum[j-1]; f[i][j][0] = min(f[i+1][j][0]+n1*(e[i+1].x-e[i].x),f[i+1][j][1]+n2*(e[j].x-e[i].x)); f[i][j][1] = min(f[i][j-1][0]+n3*(e[j].x-e[i].x),f[i][j-1][1]+n4*(e[j].x-e[j-1].x)); } } printf("%d ",min(f[1][n][0],f[1][n][1])); return 0; }
恭喜你找到一只正在洗澡的pig,稍等一会,分析马上来
以上是关于7.4集训模拟赛7的主要内容,如果未能解决你的问题,请参考以下文章