码迷,mamicode.com
首页 > 其他好文 > 详细

7.4集训模拟赛7

时间:2020-07-04 18:35:03      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:node   bsp   nbsp   --   min   mes   tac   names   typedef   

 恭喜你找到一只正在洗澡的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\n",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("\n");
    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\n",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\n",min(f[1][n][0],f[1][n][1]));
    return 0;
}

 恭喜你找到一只正在洗澡的pig,稍等一会,分析马上来

7.4集训模拟赛7

标签:node   bsp   nbsp   --   min   mes   tac   names   typedef   

原文地址:https://www.cnblogs.com/LightyaChoo/p/13235801.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!