Codeforces Round #351 A B C D

链接:http://codeforces.com/contest/673

A:

看一个节目最长90分钟,给你n个时间点,代表感兴趣的点,如果从某一个点到下一个点时间超过15分钟就不看了,问最多看多长时间。

直接按题意模拟一遍。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int a[100];
int main() {
    int n;
    int ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);

    }
    for(int i=1;i<=n;i++) {
        if(a[i]-a[i-1]>15) {
            break;
        }
        ans=a[i];
    }
    cout<<min(ans+15,90)<<endl;
    return 0;
}

B:

给你n个问题,m组相似问题,现在要将这些问题分成两组(每个组不能为空),相似问题不能放到同一组,且第一组(a)所有的编号大于第二组(b)的编号,问你有多少种分配方案。

将每组相似问题的小编号放到b,大的放到a,然后在a中取出最小值,b中取出最大值,如果bmax>amin,则无解。

显然大于amin小于bmax的对答案没有贡献,所以答案就在bmax~amin中,输出amin-bmin。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int maxx,minn;
int vis[Mn];
int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    int flag=0;
    minn=n;
    for(int i=1;i<=m;i++) {
        int x, y;
        scanf("%d%d",&x,&y);
        if(x>y) swap(x,y);
        vis[x]=1;
        vis[y]=1;
        minn=min(y,minn);
        maxx=max(x,maxx);
        if(minn<=maxx) flag=1;

    }
    if(flag) {
        cout<<0<<endl;
        return 0;
    }
    if(m==0) {
            cout<<n-1<<endl;
            return 0;
    }
    int ans=1;
    for(int i=1;i<=n;i++) {//其实减一下就得到答案了
        if(vis[i]==0) {
            if(i>=maxx&&i<=minn) ans++;
        }

    }
    cout<<ans<<endl;
    return 0;
}

C:给你一个区间,让你求出每个区间的众数,这个众数的ans++。输出每个众数的ans。

直接暴力枚举区间左端点,然后滑动窗格求出。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int num[Mn];
int ans[Mn];
int a[Mn];
int main() {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++) {
        for(int j=i;j<=n;j++) num[a[j]]=0;
        for(int j=i,pos=a[i];j<=n;j++) {
            num[a[j]]++;
            if(j!=i) {
                if(num[a[j]]>num[pos]) {
                    pos=a[j];
                }
                if(num[a[j]]==num[pos]) pos=min(a[j],pos);
            }
            ans[pos]++;
        }
    }
    for(int i=1;i<=n;i++) {
        printf("%d ",ans[i]);
    }
    return 0;
}

D:

给你n个点。其中的四个点(abcd)已给出,让你用不超过k条边且最小的边使得,a经过所有的点一次到b,c同样到d,且ab,cd没有直接路径。

假设我们只有四个点,我们只有完全图才可以所有点经过一次,暗示这样ab,cd就有了直接路径。去掉后,ac,db这两条线有个交点,认为是第五个点,

通过他才满足条件。多余五个点的随便放到一条边上。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int vis[Mn];
int main() {
    int n,k;
    scanf("%d%d",&n,&k);
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    vis[a]=1;vis[b]=1;vis[c]=1;vis[d]=1;
    if(k<n+1) {
        cout<<-1<<endl;
        return 0;
    }
    if(n<=4) {
        cout<<-1<<endl;
        return 0;
    }
    int pos=0;
    for(int i=1;i<=n;i++) {
        if(vis[i]==0) {
            pos=i;
            vis[pos]=1;
            break;
        }
    }
    cout<<a;
    for(int i=1;i<=n;i++) {
        if(vis[i]) continue;
        vis[i]=2;
        printf(" %d",i);
    }
    printf(" %d %d %d %d\n",d,pos,c,b);
    printf("%d %d %d %d ",c,b,pos,a);
    for(int i=1;i<=n;i++) {
        if(vis[i]!=2) continue;
        printf("%d ",i);
    }
    cout<<d<<endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值