Time Limit: 1000MS | Memory Limit: 10000K |
Description
Given the number of cells, determine how many prisoners escape jail.
Input
Output
Sample Input
2 5 100
Sample Output
2 10
【题目大意】
一个监狱看守员喝醉了酒,于是把监狱每扇门都打开(假设有n扇门);然后再从1号门开始,隔一扇关一个门(把2的倍数的门关掉);
接着再从1号门开始,隔2扇操作一个门(操作3的倍数的门,原来是开的关掉,关着的则打开)。这样一直操作到n的倍数,问最后有多少扇门是打开的。
【题目分析】
· 用一个数组存放门的状态(开或关)
· 用两个循环来改变门的状态
· 输出结果
【代码描述】
1 /*============================================================================*\ 2 * 3 * POJ 1218 THE DRUNK JAILER(醉汉看守) 4 * @author CocoonFan 5 * @date 3/1/2013 6 \*============================================================================*/ 7 8 #include <iostream> 9 #include <cstring> 10 11 int main() 12 { 13 char lock[200];//用char节省空间 14 int testCase, n, ans; 15 std::cin >> testCase; 16 while(testCase--){ 17 ans = 0; 18 memset(lock, 0, sizeof(lock));//初始化memset()在 cstring 中 19 std::cin >> n; 20 21 for(int i = 1; i <= n; ++i) //没有用lock[0] 22 for(int j = i; j <= n; j += i) 23 lock[j] = 1-lock[j]; 24 25 for(int i = 1; i <= n; ++i) 26 if(lock[i]) 27 ++ans; 28 29 std::cout << ans << std::endl; 30 31 } 32 33 return 0; 34 }
【另一种描述】
在转换状态的同时记录 ans 的值
1 /*============================================================================*\ 2 * POJ 1218 THE DRUNK JAILER (醉汉看守) 3 * 2013/3/1 4 * CocoonFan 5 \*============================================================================*/ 6 7 #include<iostream> 8 #include<cstring> 9 10 const int MAX_LEN = 200; 11 12 int main() 13 { 14 int t; 15 std::cin >> t; 16 int a[MAX_LEN]; 17 while(t--){ 18 memset(a,0,sizeof(a)); 19 int n; 20 std::cin >> n; 21 int ans = 0; 22 23 for(int i = 1; i <= n; ++i){ 24 for(int j = i; j <= n; j += i ){ 25 if(a[j]){ 26 a[j] = 0; 27 --ans; 28 } else { 29 a[j] = 1; 30 ++ans; 31 } 32 } 33 } 34 35 std::cout << ans << std::endl; 36 } 37 38 39 return 0; 40 }
【进一步分析】
本题有意思的在后面,我们先把1~100之内的结果列表看看。
看到规律了吧,结果就是牢房数的平方根!!!
于是我们很快得出了简短高效的代码:
1 #include <iostream> 2 #include <cmath> 3 4 int main() 5 { 6 int n, a, k; 7 std::cin >> n; 8 while(n--){ 9 std::cin >> k; 10 a = sqrt(k); 11 std::cout << a << std::endl; 12 } 13 return 0; 14 }