第一次把自己所出现的错误全部改正并且全A(确是慢慢失落感)确实有太多的不应该;
这一题刚开始感觉挺难的但是仔细想一想,并不是很难,刚开始用二分,后来发现二分也用不到就可以过
关于自己的一点小错误(其实当显示WA时一定要做两件事1.把能想到的特殊情况试一下2.把代码仔细看一遍确保每种情况是对的
1.两种情况第二种情况忘记除2
2.第一个细节忽略了coun++;
H - 生日宴会
Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu
Description
某只同学在生日宴上得到了一个N×N玻璃棋盘,每个单元格都有灯。每一秒钟棋盘会有一个单元格被点亮然后熄灭。棋盘中的单元格将以图中所示的顺序点亮。每个单元格上标记的是它在第几秒被点亮。
第一秒棋格(1,1)将被点亮,第五秒棋格(3,1)将被点亮。
现在这只同学想知道在给定的时间哪个棋格将被点亮(时间将以秒为单位给出)。题目假设N足够大。
Input
先输入一个整数T(<= 200) , 表示测试用例的组数。
每一组用例将包括一个整数S(1 ≤ S ≤ 1015),表示时间。
(注:此题中长整形的输入输出要用 %lld 格式实现)
Output
对于每组用例您必须打印用例编号和两个数字(x,y)表示列号和行号。
Sample Input
3
8
20
25
Sample Output
Case 1: 2 3
Case 2: 5 4
Case 3: 1 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
#include <iostream>
#include <cstdio>
#include <cmath>
#define MAX 100000010
using namespace std;
long long erfen(long long l,long long r,long long n)
{
long long mid;
while(l<=r)
{
mid=(r+l)/2;
if(mid*mid==n)
return mid;
if(mid*mid<n&&pow(mid+1,2)>n)
return mid+1;
else if(mid*mid>n)
r=mid-1;
else
l=mid+1;
}
if(1*1==n)
return 1;
else
return -1;
}
int main()
{
long long n,mid;
int coun=1,sum;
long long j,i;
scanf("%d",&sum);
while(sum--)
{
scanf("%lld",&n);
j=erfen(1,MAX,n);
if(j%2!=0)
{
mid=(j*j+(j-1)*(j-1)+1)/2;
if(n>=mid)
{
i=j*j-n+1;
printf("Case %d: %lld %lld\n",coun++,i,j);
}
else
{
i=n-(j-1)*(j-1);
printf("Case %d: %lld %lld\n",coun++,j,i);
}
}
else
{
mid=(j*j+(j-1)*(j-1)+1)/2;
if(n>=mid)
{
i=j*j-n+1;
printf("Case %d: %lld %lld\n",coun++,j,i);
}
else
{
i=n-(j-1)*(j-1);
printf("Case %d: %lld %lld\n",coun++,i,j);
}
}
}
return 0;
}