摘要: 题解:如果知道水面的高度,则直接可以算出水的体积,我们知道水的高度必然在0到最大高度之间,于是在这个区间内进行二分检索即可:#include #include #include using namespace std; #define PI 3.1415926535897932384626 #define exp 1e-9 double solve(double r,double R,double h,double H) { double u = h/H*(R-r) + r; return PI/3*(r*r+r*u+u*u)*h; } int m... 阅读全文
posted @ 2014-02-08 19:58 forever97 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 题解:如果三个数组进行查找会发现是一件很困难的事,那么把题目条件转化一下,将a,b数组相加产生一个和数组,之后再在s数组中查找有没有sum-c[i]即可。#include #include using namespace std;int a[505],b[505],c[505];int s[250005];bool find(int x,int l,int r){ if(l>r) return false; int mid=(l+r)/2; if(s[mid]==x) return true; else if(s[mid]>x) return find... 阅读全文
posted @ 2014-02-08 16:14 forever97 阅读(135) 评论(0) 推荐(0) 编辑
摘要: #include int main(){ int n,m; scanf("%d",&m); while(scanf("%d",&n)!=EOF) { int x,ans; ans=0; for(int i=1; i<=n; i++) { scanf("%d",&x); ans+=x; } if (m==1) printf("%d\n",ans); else printf("%d\n\n",ans); m--; } return 0;} 阅读全文
posted @ 2014-02-07 15:52 forever97 阅读(108) 评论(0) 推荐(0) 编辑
摘要: #include #include int main(){ int a,b; while(scanf("%d%d",&a,&b)!=EOF) if (a+b) printf("%d\n\n",a+b); return 0;} 阅读全文
posted @ 2014-02-07 15:51 forever97 阅读(107) 评论(0) 推荐(0) 编辑
摘要: #include int main(){ int n; while(scanf("%d",&n)!=EOF) { int x,ans; ans=0; for(int i=1; i<=n; i++) { scanf("%d",&x); ans+=x; } printf("%d\n",ans); } return 0;} 阅读全文
posted @ 2014-02-07 15:50 forever97 阅读(105) 评论(0) 推荐(0) 编辑
摘要: #include int main(){ int n,m,ans,x; scanf("%d",&m); for(int i=1; i<=m; i++) { ans=0; scanf("%d",&n); for(int j=1; j<=n; j++) { scanf("%d",&x); ans+=x; } printf("%d\n",ans); } return 0;} 阅读全文
posted @ 2014-02-07 15:49 forever97 阅读(92) 评论(0) 推荐(0) 编辑
摘要: #include int main(){ int n; while(scanf("%d",&n)!=EOF) if (n) { int x,ans; ans=0; for(int i=1; i<=n; i++) { scanf("%d",&x); ans+=x; } printf("%d\n",ans); } return 0;} 阅读全文
posted @ 2014-02-07 15:48 forever97 阅读(101) 评论(0) 推荐(0) 编辑
摘要: #include int main(){ int a,b; while(scanf("%d%d",&a,&b)!=EOF) if (a+b) printf("%d\n",a+b); return 0;} 阅读全文
posted @ 2014-02-07 15:47 forever97 阅读(94) 评论(0) 推荐(0) 编辑
摘要: #include int main(){ int n,a,b; scanf("%d",&n); for (int i=1; i<=n; i++) { scanf("%d%d",&a,&b); printf("%d\n",a+b); } return 0;} 阅读全文
posted @ 2014-02-07 15:46 forever97 阅读(124) 评论(0) 推荐(0) 编辑
摘要: #include int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) printf("%d\n",a+b); return 0;} 阅读全文
posted @ 2014-02-07 15:45 forever97 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 还没学过导数,不会做……#include #include using namespace std;//先求导函数,可知f'(x)=g'(x)+y,g'(x)为递增函数,//1)若导函数最大值小于0,即g'(100)+y0,则原函数在区间内单调递增,最小值为f(0).//3)若导函数有正有负,因导函数单调递增,所以必然从负值开始穿过x轴,导函数由负变正,原函数先减后增,其0点即原函数的最小值点.//(或求二阶导数,在区间内,f''(x)>0,则原函数为凹函数,有最小值点.否则,为凸函数,有最大值点)double f(double x,int 阅读全文
posted @ 2014-02-07 15:03 forever97 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 题解:二分求解#include #include using namespace std;double f(double x){ return(8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*x+6);}int main(){ int t; double l,r,mid,yl,yr,y,y1; scanf("%d", &t); while(t--) { l=0; r=100; scanf("%lf",&y1); yl=f(l)-y1; yr=f(... 阅读全文
posted @ 2014-02-07 14:44 forever97 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 题目大意:现在给出商品,有三个参数,记为pi,qi,vi,vi是商品的在你心里价值,pi是商品的价格,qi是你要买商品的时候至少需要的钱然后求可得的最大价值。单词积累:Merchants 商人 typical 标志性的题解:首先我们考虑商品A,B,其pi,qi,vi记为pA,qA,vA,pB,qB,vB,我们可以发现,有些买东西的顺序也会决定你可以得到的最大价值,那么怎么才可以使顺序无影响呢?可以这样想,我们如果A,B都要买,先买A,那么需要的资金至少为pA+qB,先买B,那么需要的资金至少为pB+qA,那么想要资金越少,要先买qi-pi大的商品,所以排序一下再背包就可以了。#include 阅读全文
posted @ 2014-02-07 14:08 forever97 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 题解:贪心思想,去除一个最大值,背包容量减5,直接01背包即可。#include #include #include using namespace std; int main() { int n,m; while(scanf("%d",&n),n!=0){ int a[1005]; memset(a,0,sizeof(a)); for(int i=1;i=a[i];j--) if(f[j]<f[j-a[i]]+a[i]) ... 阅读全文
posted @ 2014-02-07 13:34 forever97 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 题解:显然的双重背包。#include int f[105][1005],v[105],w[105];int main(){ int t,n,m,l; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&l); for(int i=1;i=1;j--) for(int k=l;k>=w[i];k--) if (f[j-1][k-w[i]]+v[i]>f[j][k]) f[j][k]=f[j-1][k-w[i]]+v[i]; if (f[m]... 阅读全文
posted @ 2014-02-07 10:16 forever97 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 题目大意:有六堆石头,第i堆的价值为i,读入数据表示该堆石头的个数,现在要求得出是否可以分为价值相同的两堆。题解:直接将石子数相加,如果为奇数则显然不可分,然后就是01背包的二进制拆分问题了。#include int main(){ int a[7],k,cnt=1; bool f[120000]; while(true) { int sum=0; for(int i=1;i 0;i--) f[i] = false; f[0] = true; for(int i=1;i=temp;j--) ... 阅读全文
posted @ 2014-02-07 09:42 forever97 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 旧的一年终究远去,伸手轻触流光,远去的一切,恍若一个世纪,记忆带着温柔的微光在黑暗里跳跃,如同寒夜里珍藏起的幻梦,所有我爱和爱我的人们,愿你们安好……Miss you 给小扬,那个无数遍对我说晚安的人,那个陪我走过最难过的时光的人,那个总是对我说无论发生什么我会一直陪着你的人,那个给我发... 阅读全文
posted @ 2014-01-26 11:01 forever97 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 题解:背包问题方案总数,用二进制优化。#include #include using namespace std; int f[100005]; int a[105],c[105]; int main() { int i,j,k,n,m,cnt; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(i=0;i=k*a[i];j--) f[j]+=f[j-k*a[i]]; cnt-=k; ... 阅读全文
posted @ 2014-01-23 10:23 forever97 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 学习了一下一下map的迭代器,刷一题裸题练习一下:#include #include #include #include using namespace std; int main() { int n; while(scanf("%d",&n)&&n) { int max=0; map mp; map::iterator p; string s; for(int i=0;i>s; mp[s]++; } ... 阅读全文
posted @ 2014-01-22 19:25 forever97 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题解:将背包总量分为两份,之后多重背包即可#include #include int f[300000],w[1000],t[1000];int main(){ int n; while(scanf("%d",&n),n>=0) { int v=0; for(int i=1; i=k*w[j]; i--) if (f[i-w[j]]+w[j]>f[i]) f[i]=f[i-w[j]]+w[j]; printf("%d %d\n",v-f[v/2],f[v/2]); } return 0;} 阅读全文
posted @ 2014-01-22 15:17 forever97 阅读(129) 评论(0) 推荐(0) 编辑