B题:
看别人的解题报告,说是夹逼定理,第一次听说,以前没听说过,数学没好好学啊……其实就是一个数,最多能被分解成3个数之和。
其实就是二分枚举答案,或者也可以用两次for循环来搞。
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <list> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define sc(a,b) scanf("%d%d",&a,&b) #define pri(a) printf("%d\n",a) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define MM 16005 #define MN 110 #define INF 55566677 #define eps 1e-7 using namespace std; typedef long long ll; int t,n,m,i,l,r,sum[MM]; int solve(int t) //二分枚举来执行夹逼定理 { l=1,r=lower_bound(sum,sum+MM,t)-sum; while(l<=r) { int mid=sum[l]+sum[r]; if(mid==t) return 1; else if(mid>t) r--; else l++; } return 0; } int main() { for(i=1;i<MM;i++) sum[i]=sum[i-1]+i; sca(t); while(t--) { sca(n); m=lower_bound(sum,sum+MM,n)-sum; if(sum[m]==n) pri(m); else if(solve(n)) printf("%d %d\n",l,r); else { for(i=1;i<MM;i++) if(solve(n-sum[i])) { printf("%d %d %d\n",i,l,r); break; } } } return 0; }
原文:http://blog.csdn.net/u011466175/article/details/23349957