我说吧,自从花费2天时间A掉了java面试宝典,给我一种这本书的质量持有怀疑态度。不多说了,估计以后很少看这类书了。
今天早起看了看大白,自言自语到,估计今天再刷2小章吧,这是一场说刷就刷。大概作者也是让领会他写程序的精髓吧。
今天被C语言的一个细节坑了。scanf("%d",&a[i],&&b[i++]) 。我天真的以为会读取赋值后,然后i++的。果断最后debug下,才发现在第一次读取后i++的优先级大于读取符(不知道这样理解对不对),自然第二个会多+1。
/* 3 2 2 2 5 3 2 1 0.75 */ #include<iostream> using namespace std; const int MAXN=1e4; int n,k,w[MAXN],v[MAXN]; double y[MAXN];//v[i]-x*w[i] void input(){ scanf("%d",&n); scanf("%d",&k); int i=0; while(i<n){ scanf("%d%d",&w[i],&v[i]); //scanf("%d%d",&w[i],&v[i++]);坑死了 i++; } } //C(x):=使得单位重量的价值不小于x //C(x)=((v[i]-x*w[i])从大到小排序的前k项之和不小于0) bool C(double x){ //计算y=v[i]-x*w[i] for(int i=0;i<n;i++) y[i]=v[i]-x*w[i]; sort(y,y+n); //reverse(y,y+n); //printf("%lf\n",x); //从y值大到小,选k项>=0 double sum=0; for(int i=0;i<k;i++) sum+=y[n-1-i]; return sum>=0; } void sovle(){ double lb=0,ub=10e6; for(int i=0;i<100;i++){ double mid=(lb+ub)/2; if(C(mid)) // [mid,ud) lb=mid; else ub=mid; //(ld,mid) } printf("%.2f\n",ub); } int main(){ input(); sovle(); return 0; }
/* 最大化最小值问题 5 3 1 2 8 4 9 3 */ #include <iostream> using namespace std; const int MAXN=1<<11; int N,M,X[MAXN],INF=1<<20; void input(){ scanf("%d",&N); scanf("%d",&M); int i=0; while(i<N) scanf("%d",&X[i++]); } //C(d):= 安排牛的位置,使得任意牛的间距都不小于d bool C(int d){ int last=0; for(int i=0;i<M-1;i++){ int crt=last+1; while(crt<N && X[crt]-X[last]<d) //符合>=d停止 crt++; if(crt==N) return false; last=crt; } return true; } void sovle(){ sort(X,X+N); int lb=0,ub=INF; while(ub-lb>1){ int mid=(ub+lb)/2; if(C(mid)) lb=mid; else ub=mid; } printf("%d\n",lb); } int main(){ input(); sovle(); return 0; }
/* 假定一个解并判断是否可行 C(x):=所选的长度x,使得切割的总个数>=K 4 11 8.02 7.43 4.57 5.39 2.00 */ #include<iostream> #include<math.h> using namespace std; const int MAXN=1<<10; int N,K; double INF=1<<20; double L[MAXN]; void input(){ scanf("%d",&N); scanf("%d",&K); int i=0; while(i<N) scanf("%lf",&L[i++]); //读取double值。坑死我啦 } //C(x):=所选的长度x,使得切割的总个数>=K bool C(double x){ int cnt=0; for(int i=0;i<N;i++){ cnt+=(int)(L[i]/x); if(cnt>=K) return true; } return false; } void solve(){ double lb=0,ub=INF; for(int i=0;i<100;i++){ double mid=(lb+ub)/2; if(C(mid)) //[mid,ub) lb=mid; else ub=mid; //(lb,mid) } printf("%.2f\n",floor(ub*100)/100); } int main(){ input(); solve(); return 0; }
/* 从有序数组中查找某个值 5 2 3 3 5 6 3 1 */ #include<iostream> const int MAXN=1<<12; int INF=1<<12; int n,k; int a[MAXN]; void input(){ scanf("%d",&n); int i=0; while(i<n) scanf("%d",&a[i++]); scanf("%d",&k); } void sovle(){ int lb=-1,ub=n; while(ub-lb>1){ int mid=(lb+ub)/2; if(a[mid]>=k) //(lb,ub] ub=mid; else lb=mid;// (mid,ub] } // 此时 1b+1=ub printf("%d\n",ub); } int main(){ input(); sovle(); return 0; }