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想合力把所有数字都擦掉的话,最少需要执行多少次擦除的操作?
这一次,他们发明了一个关于数列的游戏。
首先,他们在黑板上写下了1到N这N个数字。在游戏过程中,他们轮流从黑板上选择一个数字,然后把它和它的所有约数全部从黑板上擦去。
我们想知道的是,如果Alice和Bob想合力把所有数字都擦掉的话,最少需要执行多少次擦除的操作?
Input
输入的第一行是测试数据的组数T(T<=10)。
每组测试数据仅包含一个整数N(1<=N<=104)。
每组测试数据仅包含一个整数N(1<=N<=104)。
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;
}

被折叠的 条评论
为什么被折叠?



