题意及思路
题目大意:给定一个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; }