Codeforences #351 VK CUP

【A. Bear and Game:】

【题意】给这么多时间点,这些时间点是interesting的点,如果连续15分钟不出现interesting的点的话,就要换了;问最长能看多上时间

【分析】直接模拟一下即可。

【AC代码】

#include <bits/stdc++.h>
using namespace std;
int a[100];
int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i=1; i<=n; i++){
            scanf("%d",&a[i]);
        }
        if(a[1]>15){
            puts("15");
            return 0;
        }
        for(int i=2; i<=n; i++){
            if(a[i]-a[i-1]>15){
                printf("%d\n",a[i-1]+15);
                return 0;
            }
        }
        if(a[n]<75)
        {
            cout<<a[n]+15<<endl;
        }
        else{
            cout<<"90"<<endl;
        }
    }
    return 0;
}

【B. Problems for Round】

【题意】把1到n这些数放到两个容器里,要求第一个容器里的任何数都小于第二个容器里的任何数,还有就是相似的不能放一块,相似没有传递性

【分析】两个容器第一个记录最大值,第二个记录最小值,对每一对相似的数,小的放在第一个,大的放在第二个,同时检测是否满足最大值最小值,还要更新最大最小,答案就是两者的差!

【AC代码】

#include <bits/stdc++.h>
using namespace std;
int a[100010];
const int INF = 0x3f3f3f3f;
int main(){
    int n,m,u,v,maxx=-1,minn=INF,ans;
    cin>>n>>m;
    for(int i=1; i<=m; i++){
        cin>>u>>v;
        if(u>v)swap(u,v);
        maxx = max(maxx,u);
        minn = min(minn,v);
    }
    if(m==0)ans=n-1;
    else{
            if(minn<maxx) ans=0;
            else ans = minn-maxx;
    }
    cout<<ans<<endl;
    return 0;
}

【C. Bear and Colors】

【题意】给出这么多颜色,在一个序列中,dominant是出现次数最多的数,如果出现次数最多的不止一个,那么就是数值最小的那个

【分析】可以直接暴力统计了

【AC代码】

#include <bits/stdc++.h>
using namespace std;
int n,a[5010];
int ans[5010];
int temp;
int main(){
    cin>>n;
    for(int i=1; i<=n; i++) cin>>a[i];
    for(int i=1; i<=n; i++){
        int cnt[5010]={0};
        int maxx=-1;
        for(int j=i; j<=n; j++){
            cnt[a[j]]++;
            if(cnt[a[j]]>maxx){
                maxx = cnt[a[j]];
                temp = a[j];
            }else if(cnt[a[j]]==maxx&&a[j]<temp){
                temp = a[j];
            }
            ans[temp]++;
        }
    }
    for(int i=1; i<=n; i++)cout<<ans[i]<<" ";
    return 0;
}

【D. Bear and Two Paths】

【题意】给出n个节点,然后给出两条路线的起点和终点,要求你构造一个无向图,使无向图中a,b之间和c,d之间均无直接相连的边,且要求这个图的边的条数不超过k

【分析】发现n==4时怎么都不可能满足,可以构造这样的无向图,第一条路线ac...db;第二条路线ca...bd,这样的边是n+1条,是最少的了

【AC代码】

#include <bits/stdc++.h>
using namespace std;
int n,k,a,b,c,d;
int ans[1010],vis[1010];
int main(){
    cin>>n>>k;
    cin>>a>>b>>c>>d;
    memset(vis,0,sizeof(vis));
    memset(ans,0,sizeof(ans));
    vis[a]=vis[b]=vis[c]=vis[d]=1;
    if(k<n+1||n==4){
        puts("-1");
        return 0;
    }
    ans[1]=a,ans[2]=c,ans[n-1]=d,ans[n]=b;
    int pos=3;
    for(int i=1; i<=n; i++){
        if(!vis[i]) ans[pos++]=i;
    }
    for(int i=1; i<=n; i++)cout<<ans[i]<<" ";cout<<endl;
    cout<<ans[2]<<" "<<ans[1]<<" ";
    for(int i=3; i<=n-2; i++)cout<<ans[i]<<" ";
    cout<<ans[n]<<" "<<ans[n-1]<<endl;
    return 0;
}

【ps:后面的题暂时做不来QAQ】

你可能感兴趣的:(Codeforences #351 VK CUP)