2017-07-07 Codeforces 团队赛

 

题意及思路

题目大意:给定一个H(x,y)方程及一个数 r,求能否有一对(x,y)能满足H 求得 r。当然有条件的 x的值尽可能小。如果没有这样的x,则输出“NO”。

 

思路:单层循环,循环的范围是1 到 sqrt(r),每一次利用 x 的值去找是否有 y 能够匹配。即 t = r - x*x - x - 1; if(t > 0 && t%2==0)则 y = t/2;

 

踩坑点:这题的数据范围很大,r 的 范围到了 12次方级别,第一个降时间复杂度的点事 x的范围 <= sqrt(r)。第二个降的点是拿x 和 r 去找满足条件的 y ,之前用的都是双层循环,虽说外层循环降了,内层也降了一半,但是外层的sqrt(r)仍然是 6 次方,双层循环很恐怖的。还有一个点,就是题目说的是正整数,x、y的值只能从1开始,切记!

这里用的数据类型是__int64,存放大整数.

 

官方题解

 

 

代码

#include<stdio.h>
#include<math.h>
int reverseH(__int64 r,__int64 *x,__int64 *y);

int main(){
    __int64 r,x,y;
    scanf("%I64d",&r);
    if(reverseH(r,&x,&y)){
        printf("%I64d %I64d\n",x,y);
    }else{
        printf("NO\n");
    }
    return 0;
}

int reverseH(__int64 r,__int64 *x,__int64 *y){
    __int64 t,flag = 0;
    for(__int64 i=1;i<=sqrt(r);i++){
        t = r-i*i-i-1;
        if(t>0 && t%2==0){
            *x = i;
            *y = t/2;
            flag = 1;
            break;
        }
    }
    return flag;
}

 

 

 

 

题意及思路:

题意:略。

思路:简单模拟。

 

代码

#include<stdio.h>
/*
flag = 1 -> 插入
flag = 0 -> 二合一
*/
int main(){
    int n,k,m,t,flag,i,len;
    scanf("%d %d %d %d",&n,&k,&m,&t);
    len = n; 
    while(t--){
        scanf("%d %d",&flag,&i);
        if(flag){//insert
            if(len<m){
                if(i>k) len++;
                else {k++;len++;}
            }else continue;
        }else{//broken
            if(len==1) continue;
            if(i>=k) len=i;
            else{
                len -= i;
                k -= i;
            }
        }
        printf("%d %d\n",len,k);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/kyrie211/p/11148338.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值