题意:给你一个数s,让你求出最小的n使得在1...n之间加入加减号能是其和等于s
思路:减去一个数k的时候就相当于总和减小了2*k,也就是减小了一个偶数。当总和和s之差为偶数有解
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define maxN 100010
int key[maxN];
int fun(int l,int r,int n)
{
if(l==r)return l;
int mid=(l+r)/2;
if(key[mid]>=n)return fun(l,mid,n);
else return fun(mid+1,r,n);
}
int main()
{
int n;
for(int i=1;i<maxN;i++)
key[i]+=key[i-1]+i;
while(~scanf("%d",&n))
{
int m=fun(1,n,n);
while(1){
if((key[m]-n)%2==0){
printf("%d\n",m);
break;
}
m++;
}
}
}
920

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



