Codeforces Round #298 (Div. 2)——A.B.C.D.E

http://codeforces.com/contest/534

A. Exam

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    if(n<=2){
        printf("1\n1\n");
    }
    else if(n==3){
        printf("2\n1 3\n");
    }
    else{
        printf("%d\n",n);
        for(int i=1;i<=n;++i){
            if(~i&1)printf("%d ",i);
        }
        for(int i=1;i<=n;++i){
            if(i&1) printf("%d ",i);
        }
    }
    return 0;
}

B. Covered Path
题目描述:
给定初速度v1和末速度v2,运动时间t,加速度a,求在t秒内最多可以运行的路程

分析:让速度尽可能大,肯定路程就越远,暴力模拟一下

#include<bits/stdc++.h>
using namespace std;
int v1,v2,t,d;
int main()
{
    scanf("%d%d%d%d",&v1,&v2,&t,&d);
    int ret=v1;
    for(int k=2;k<=t;++k){
        for(int i=d;i>=-d;--i){
            if(abs(v1+i-v2)<=(t-k)*d){
                v1+=i;
                break;
            }
        }
        ret+=v1;
    }
    printf("%d\n",ret);
    return 0;
}

C. Polycarpus’ Dice
题目描述:
给定n个骰子,每个骰子的最大点数di(1~di),求使得n个骰子的点数和为a,每个骰子不可能出现的点数的个数

分析:求每个骰子的取值范围:
假设第i个骰子的点数为x,剩余骰子的点数为y,得:
x+y=a;
y>=n-1;其余每个骰子的点数至少为1
y<=sum-d[i];其余每个骰子的点数的最值

则可得:
a-n+1>=x
a-sum+d[i]<=x

#include<bits/stdc++.h>
#define ll long long
const int MAXN=200010;
using namespace std;
ll d[MAXN],sum,n,a;
int main()
{
    scanf("%I64d%I64d",&n,&a);
    for(int i=1;i<=n;++i){
        scanf("%I64d",&d[i]);
        sum+=d[i];
    }
    for(int i=1;i<=n;++i){
        printf("%I64d ",d[i]-(min(a-n+1,d[i])-max(a-sum+d[i],(ll)1)+1));
    }
    return 0;
}

D. Handshakes
题目描述:
给定n个人和每个人问候的次数,求可能的进入房间的顺序。可以3个人组成一队进入比赛,则不和该队问候

分析:
简单模拟,如果当前存在问候次数为num的人,就让该人进入房间,否则num-3(问候次数为num,现在进入和后面进入没有关系,状态是一样的,这样子操作,如果存在合法解,则这样子一定可以得到合法解)

#include<bits/stdc++.h>
const int MAXN=200100;
using namespace std;
queue<int> q[MAXN];
int vis[MAXN];
int n;
int ans[MAXN];
int main()
{
    int a;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a);
        vis[a]++;
        q[a].push(i);
    }
    int cnt=0,num=0;
    while(cnt<n&&num>=0){
        if(vis[num]){
            vis[num]--;
            ans[++cnt]=q[num].front();
            q[num].pop();
            num++;
        }
        else num-=3;
    }
    if(cnt<n) puts("Impossible");
    else{
        puts("Possible");
        for(int i=1;i<=cnt;++i){
            printf("%d ",ans[i]);
        }
        printf("\n");
    }
    return 0;
}

E. Berland Local Positioning System
题目描述:
有n个汽车站,按递增顺序给出每个汽车站离市中心的距离,然后给出每个站点被访问的次数,求汽车可能走的路程,如果存在多种答案,输出-1

分析:
输出-1的情况只有一种,就是路过所有点的次数都相等(除了首部和尾部),且每条边的长度有一种不相等,其他情况直接暴力搞

#include<bits/stdc++.h>
typedef long long ll;
const int inf=0x3f3f3f3f;
const int MAXN=200100;
using namespace std;
int n,m;
int a[MAXN],b[MAXN];
int Min,Max;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    scanf("%d",&m);
    int x;
    for(int i=1;i<=m;++i){
        scanf("%d",&x);
        b[x]++;
        if(x==1||x==n) b[x]++;
    }
    Min=inf,Max=0;
    for(int i=1;i<=n;++i){
        Max=max(Max,b[i]);
        Min=min(Min,b[i]);
    }
    if(Min==Max){
        bool flag=true;
        for(int i=1;flag&&i<=n-2;++i){
            if(a[i+1]-a[i]!=a[i+2]-a[i+1])
                flag=false;
        }
        if(!flag) puts("-1");
        else{
            printf("%I64d\n",(ll)(a[n]-a[1])*Min-(a[2]-a[1]));
        }
    }else{
        ll ans=0;
        for(int i=2;i<=n;++i){
            ans+=(ll)(a[i]-a[i-1])*min(b[i],b[i-1]);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值