HDU 5065 Oh! My math home work Posted on 2016-07-20 | In ACM | 0 Comments | Visitors 题目链接HDU 5065 解题方法:三分 题目分析题目大意找 f(x)=Ax2−Bsinx−Y,A≥0,B≥0的零点 解析设置区间长度平移区间,找到第一个有零点的区间然后进行三分求出零点即可 代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980#include <set>#include <map>#include <stack>#include <cmath>#include <queue>#include <cstdio>#include <string>#include <vector>#include <iomanip>#include <cstring>#include <iostream>#include <deque>#include <algorithm>#define Memset(a,val) memset(a,val,sizeof(a))#define PI acos(-1)#define rt(n) (i == n ? '\n' : ' ')#define hi printf("Hi----------\n")#define IN freopen("input.txt","r",stdin);#define OUT freopen("output.txt","w",stdout);#define debug(x) cout<<"Debug : ---"<<x<<"---"<<endl;#define mp make_pair#define pb push_back#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;typedef long long ll;typedef pair <int, int> pii;const int maxn=100000+5;const int mod=1000000007;const int INF=0x3f3f3f3f;const double eps=1e-8;int num[3005*3005];int a[3005];int c[3005];int dp[3005][3005];int main(){ int t; scanf("%d",&t); while (t--) { Memset(dp, 0); int n,m; scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) { scanf("%d",&num[i]); } sort(num+1, num+1+n); int cnt=1; a[cnt]=num[1]; c[cnt]=1; for (int i=2; i<=n; i++) { if (num[i]==num[i-1]) { c[cnt]++; } else{ a[++cnt]=num[i]; c[cnt]=1; } } for (int i=1; i<=cnt; i++) { dp[i][i]=c[i]; } int ans=0; for (int i=1; i<=cnt; i++) {//中间位 int tmp = dp[i][i]; ans=max(ans, tmp); int k = i; for (int j=i+1; j<=cnt; j++) { for (; k>=1&&a[i]-a[k]<=a[j]-a[i]; k--) { tmp=max(tmp, dp[k][i]+1); } dp[i][j]=tmp; ans=max(ans, tmp); } } cout<<ans<<endl; } return 0;}