hdu acm 1.2.3 An Easy Task (二分查找)

来源:互联网 发布:广州淘宝儿童模特 编辑:程序博客网 时间:2024/06/06 09:12

An Easy Task

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 1927 Accepted Submission(s): 1153


 

Problem Description

Ignatius was born in a leap year, so he want to know when he could hold his birthday party. Can you tell him?

Given a positive integers Y which indicate the start year, and a positive integer N, your task is to tell the Nth leap year from year Y.

Note: if year Y is a leap year, then the 1st leap year is year Y.

 


 

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains two positive integers Y and N(1<=N<=10000).

 


 

Output

For each test case, you should output the Nth leap year from year Y.

 


 

Sample Input

32005 251855 122004 10000

 


 

Sample Output

2108190443236

Hint
We call year Y a leap year only if (Y%4==0 && Y%100!=0) or Y%400==0.

 

 

 

#include <stdio.h>#include <iostream>using namespace std;#define MAX 80005int map[MAX];int T;int count;int init();int find(int year,int left,int right);int main(){count = init();   //闰年个数scanf("%d",&T);while(T--){int a,num;scanf("%d%d",&a,&num);//a = add_leap(a);int node = find(a,1,count-1);   //二分查找printf("%d\n",map[node+num-1]); //下标减一}return 0;}int init(){int j = 0;for(int i = 1; i < MAX; i++){if((i%4==0 && i%100!=0) || i%400==0){map[j++] = i;}}return j;}int find(int year,int left,int right){int mid = (left+right)/2;if(left > right) return left;//year不是闰年时,返回左边值,,,)——if(year > map[mid])return find(year,mid+1,right);//右边else if(year < map[mid])return find(year,left,mid-1);//左边elsereturn mid;}