hdu2016校赛 C

Problem C

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 299    Accepted Submission(s): 180


Problem Description
Alice 和 Bob 又在玩游戏了!
这一次,他们发明了一个关于数列的游戏。
首先,他们在黑板上写下了1到N这N个数字。在游戏过程中,他们轮流从黑板上选择一个数字,然后把它和它的所有约数全部从黑板上擦去。

我们想知道的是,如果Alice和Bob想合力把所有数字都擦掉的话,最少需要执行多少次擦除的操作?
 

Input
输入的第一行是测试数据的组数T(T<=10)。

每组测试数据仅包含一个整数N(1<=N<=10 4)。
 

Output
对于每组测试数据,输出最少需要的操作次数。
 

Sample Input
   
   
   
   
2 1 2
 

Sample Output
   
   
   
   
1 1
 
思路:比赛的时候是暴力模拟的,但如果当N的范围扩大到(10^9)时,便无法继续操作,
当n为奇数时,(n+1)/2到n中的每个数必定要擦一次,而(n+1)/2之前的数不需要,因为乘以2一定小于n
当n为偶数时,n/2+1到n中的每个数必定要擦一次,而n/2之前的数不需要,因为乘以2一定小于n
综上所述,答案便为(n+1)/2
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,_;
    scanf("%d",&_);
    while(_--){
        scanf("%d",&n);
        printf("%d\n",(n+1)/2);
    }
    return 0;
}


你可能感兴趣的:(hdu2016校赛 C)