2 条回复
#include <iostream> using namespace std; int main() { int n, k; bool flag; int total; while (cin >> n >> k) { flag = true; total = 0; if (n < k) { cout << 0 <<endl; continue; } if (n <= 2 * k) { cout << 1 << endl; continue; } while (n > 2 * k) { total += 2; n = n - 2 * k; if (flag == true) { k = k + 1; flag = false; } else { k = k - 1; flag = true; } } if (n >= k) { total += 1; } //total += 1; cout << total << endl; } return 0; }
借了真题里面一位同学的答案~
var line, arr; line = read_line().split(' '); n = parseInt(line[0]); k = parseInt(line[1]);//该题纯属于数学逻辑题,应该先弄明白如何去分石堆最符合题意,然后下手寻找规律// 最佳分配方式:k+1 k k+1 k ....// n/(2*k+1) 查看可以分成多少个k+1 k的组队(t个),余数m则为组完队分剩下的;// 讨论两种情况: 第一种:当余数大于等于k时,那么符合题意的石头堆个数就是2t+1;// 第二种:当余数小于k时,即组队剩下的不足够满足提议,那么最终符合题意的石头堆个数就是2t;var m =n%(2*k+1);var t = Math.floor(n/(2*k+1));if(m>=k){ var res = 2*t+1; }else{ var res = 2*t; } print(res);
添加回复