1. 程式人生 > 實用技巧 >7.4集訓模擬賽7

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\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,稍等一會,分析馬上來