Codeforces Educational Round100A/B/C题解

A

思路:就看总数是不是9的倍数
因为伤害数是 6 3 6 3……
最小值的三倍一定大于等于总数的三分之一才行

int main() {
    int T;
	int a,b,c;
    cin>>T;
    while(T--){
        cin>>a>>b>>c;
        int minn=min(a,min(b,c));
        if((a+b+c)%9==0&&minn*9>=a+b+c){
            cout<<"YES"<<endl;
        }else cout<<"NO"<<endl;
    }
	return 0;
}

B

这题看题解做的
1、要求相邻互为倍数 故都取2的幂次即可
2、要求各项与原数列各项差的绝对值之和 小于等于 原数列各项和的一半 故取不大于原数列每项的最大的2的幂次即可

int main() {
    int T;
    sd(T);
    while(T--){
        int n;
        sd(n);
        int a[60];
        rep(i,1,n) sd(a[i]);
        rep(i,1,n){
            int cnt=0;
            while(a[i]){
                cnt++;
                a[i]>>=1;
            }
            printf("%d%c",1<<(cnt-1),i==n?'\n':' ');
        }
    }
    return 0;
}

C

模拟题。
题意是给你一串ti和xi,表示ti时刻命令机器人去了xi,只要在移动中就会忽视命令。
如果[ti,ti+1] 这一段时间里 到达过xi 那这条命令就算成功
问你对于每组样例,有多少个指令成功了
思路:
对于每组样例,先存下
然后对于当前的命令i,看是否能成功,如果不能,就找当前这个命令i结束后第一个可以执行的命令j(用lower_bound
再遍历[i+1,j-1]的命令,看当前这个xk是否会被i命令执行过程中经过
如何判断呢?要先判断xk是否和xi在x0的同向。反向直接不行。
若同向 要满足①xk要在xi到x0之间(也是同向的一种判定)
②|xk-x0| 即目的坐标与原来坐标的距离要在[ t[k]-t[i] , t[k+1]-t[i] ] 之间(因为ti时刻在x0处嘛
然后要记得换x0和当前的i
注意这两句的执行顺序!!!
最后注意开long long!!!不然过不去

const int maxn=1e5+10;
int n;
ll t[maxn],x[maxn];//注意要开longlong!!!
int main() {
	int T;
    sd(T);
    while(T--){
        scanf("%d",&n);
        rep(i,1,n){
            scanf("%lld%lld",&t[i],&x[i]);
        }
        t[n+1]=0x3f3f3f3f3f3f3f3f;
        int ans=0;
        ll x0=0;
        int i=1;
        while(i<=n){
            //当前这个若能在下一个指令出现前到达位置
            //就算成功
            //printf("i=%d  x0=%d\n",i,x0);
            if(t[i+1]-t[i]>=abs(x[i]-x0)){
                ans++;//printf("%d  ++a\n",i);
                x0=x[i];
                i++;
            }else{
                //找到第一个停下后发出的指令
                //找到bug了哈哈哈哈!!!!
                int j=lower_bound(t+i,t+n+2,t[i]+abs(x[i]-x0))-t;
                for(int k=i+1;k<=j-1;k++){
                    //对于所有还没停下的时候发出的指令
                    if(x[i]>x0){
                        if(x[k]>x0){//同向
                            if(x[k]-x0>=t[k]-t[i]&&x[k]-x0<=t[k+1]-t[i]
                                &&x[k]>x0/*这一个有点多余 条件有了*/&&x[k]<=x[i]){
                                ans++;//printf("%d  ++b\n",k);
                            }
                        }else if(x[k]<=x0){//反向不行

                        }
                    }else if(x[i]<x0){
                        if(x[k]<x0){//同向
                            if(x0-x[k]>=t[k]-t[i]&&x0-x[k]<=t[k+1]-t[i]
                                &&x[k]<x0/*这一个有点多余*/&&x[k]>=x[i]){
                                ans++;//printf("%d  ++c\n",k);
                            }
                        }else if(x[k]>=x0){//反向不行

                        }
                    }//不存在相等的情况
                }
                x0=x[i];//这里刚开始顺序反了!!!
                i=j;
            }
        }
        printf("%d\n",ans);
    }
	return 0;
}
/*
1
6
3 10
5 5
8 0
12 -4
14 -7
19 -5
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值