题意:给一个整数n,求当n由1到k的连续整数加或减组成时的最小的k。
解法:一开始觉得dp……后来觉得复杂度太大了……GG……百度了一下是个数学题orz。
如果n全部由加法组成,那么k可以组成k(k+1)/2,设减掉的部分为s,则有k(k+1)/2-2s=n,所以n和k(k+1)/2mod2同余。
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #include<iomanip> #define LL long long #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 using namespace std; int main() { int n; while(~scanf("%d", &n)) { for(int i = (int)sqrt(n); ; i++) { int tmp = (i * i + i) / 2; if(tmp < n) continue; if((tmp & 1) == (n & 1)) { cout << i << endl; break; } } } return 0; }
时间: 2024-11-08 23:16:50