最近没什么状态,找几道水题做一做。 pku 1018,枚举+贪心 枚举最大的B,然后贪心寻找P的最小值。 #include <algorithm> #include <iostream> #define _clr(a,b) memset(a,b,sizeof(a)) template<class T> void get_max(T& a,T b) { if(a<b) a=b;} using namespace std; struct node { int P,B; }nodes[105][105]; int num[105],index[105],B[10005],pB; double ans; int n; int CMPP(const void* a,const void* b) { return ((node*)a)->P-((node*)b)->P; } void DFS(int i,int B,int P) { if(i==n) { get_max(ans,(double)B/double(P)); return; } while(index[i]<num[i]&&nodes[i][index[i]].B<B) { index[i]++; } if(index[i]<num[i]&&nodes[i][index[i]].B>=B) DFS(i+1,B,P+nodes[i][index[i]].P); } int main() { freopen("e://1.in","r",stdin); int T; scanf("%d",&T); for(int t=1;t<=T;t++) { scanf("%d",&n); pB=ans=0; for(int i=0;i<n;i++) { scanf("%d",&num[i]); for(int j=0;j<num[i];j++) { scanf("%d%d",&nodes[i][j].B,&nodes[i][j].P); B[pB++]=nodes[i][j].B; } qsort(nodes[i],num[i],sizeof(node),CMPP); } sort(B,B+pB); _clr(index,0); for(int i=0;i<pB;i++) { DFS(0,B[i],0); } printf("%.3lf/n",ans); } return 0; } pku 1095就是DFS,没什么好说的。 #include <iostream> using namespace std; __int64 num[20]; char ans[100]; int index; void init() { num[0]=1; num[1]=1; __int64 sum=1; for(int i=2;;i++) { num[i]=0; for(int j=0;j<i;j++) num[i]+=num[j]*num[i-j-1]; sum+=num[i]; if(sum>500000000) break; } } void output(int n) { if(n==0) return; ans[index++]='('; ans[index++]='X'; output(n-1); ans[index++]=')'; } void Pri(int n,int left,int right) { if(n==0) { ans[index++]='('; output(left); ans[index++]='X'; output(right); ans[index++]=')'; return; } if(n>=num[left]*num[right]) Pri(n-num[left]*num[right],left+1,right-1); else { ans[index++]='('; if(left>0) Pri(n/num[right],0,left-1); ans[index++]='X'; if(right>0) Pri(n%num[right],0,right-1); ans[index++]=')'; } } int main() { init(); int T; while(scanf("%d",&T)&&T) { T--; index=0; for(int i=1;;i++) { if(T>=num[i]) T-=num[i]; else { Pri(T,0,i-1); ans[index-1]=0; printf("%s/n",ans+1); break; } } } return 0; }