//这道题一开始还不知道怎么做,后来一想,要是两组体重差最小, //必然某一组极度接近总重的一半。显然又是一道背包。 #include <stdio.h> int max(int a,int b) { if(a>b) return a; else return b; } int main() { int n,w[101]={0},allsum=0,i,r,f[10001]; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&w[i]); allsum+=w[i]; } int top=allsum/2; for(r=0;r<=top;r++) if(r<w[1]) f[r]=0; else f[r]=w[1]; for(i=2;i<=n;i++) for(r=0;r<=top;r++) if(r<w[i]) f[r]=f[r]; else f[r]=max(f[r],f[r-w[i]]+w[i]); printf("%d",allsum-2*f[top]); return 0; }
RQNOJ 66 级数求和
//特别注意要强制类型转换。 //当然也可以不用。这是另一份参考:http://sfiction.blog.163.com/blog/static/199404010201110835749863/ #include <stdio.h> int main() { double sn=0; int k; int sum=0; scanf("%d",&k); while(sn<=k) { sum++; sn+=1/(double)sum; } printf("%d",sum); return 0; }
RQNOJ 602 [NOIP2010普及组]数字统计
//对对,我知道那个tj函数不用这样,但是这样代码就有重用的可能性了。 //水题,毕竟后来发现这是普及组的。 #include <stdio.h> int sta[10]={0}; void tj(int k) { if(k<10) sta[k]++; else { sta[k%10]++; tj(k/10); } } int main() { int l,r; scanf("%d%d",&l,&r); int i; for(i=l;i<=r;i++) tj(i); printf("%d",sta[2]); return 0; }
RQNOJ 39 饮食问题
#include <stdio.h> int max(int a,int b) { if(a>b) return a; else return b; } int main() { int ca[22]={0}; int f[22][35001]; int i,r; int b; int up; scanf("%d%d",&up,&b); for(i=1;i<=b;i++) scanf("%d",&ca[i]); for(r=0;r<=up;r++) if(r<ca[1]) f[1][r]=0; else f[1][r]=ca[1]; for(i=2;i<=b;i++) for(r=0;r<=up;r++) { if(r<ca[i]) f[i][r]=f[i-1][r]; else f[i][r]=max(f[i-1][r],f[i-1][r-ca[i]]+ca[i]); } printf("%d",f[b][up]); return 0; }
RQNOJ 304 最大公约数和最小公倍数问题
//这道题的数学技巧比较强。 #include <stdio.h> #include <math.h> long int gcd(long int a,long int b) { if(a%b!=0) return gcd(b,a%b); else return b; } int main() { long int x,y; scanf("%ld%ld",&x,&y); long int i,num; num=0; for(i=x;i<=y;i++) { if(x*y%i==0&&x==gcd(i,x*y/i)) num++; } printf("%ld",num); return 0; }
RQNOJ 25 合并果子
//先一次快排。以后挪一挪。 //贪心。 //又想起WJMZBMR曾经用这道题演示C++的STL。这样不就几乎不用做了吗? #include<stdio.h> #include<stdlib.h> int comp(const void *p1,const void *p2) { return *((int *)p1)-*((int *)p2); } int main() { int i,n,j,a[10001]={0},s=0,t; scanf("%d",&n); for(i=0;i<=n-1;i++) scanf("%d",&a[i]); qsort(a,n,sizeof(int),comp); for(i=0;i<=n-2;i++) { a[i+1]=a[i]+a[i+1]; s+=a[i+1]; for(j=i+1;j<=n-2;j++) if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } printf("%d",s); return 0; }
RQNOJ 20 不高兴的津津
//模拟全过程就行了。 #include <stdio.h> int main() { int hp[8]={0,0,0,0,0,0,0,0}; int i; for(i=1;i<=7;i++) { int a,b; scanf("%d%d",&a,&b); hp[i]=a+b; } for(i=1;i<=6;i++) { if(hp[i]>8) hp[i]-=8; else hp[i]=0; // hp[i+1]+=hp[i]; } if(hp[7]>8) hp[7]-=9; else hp[7]=0; int t=0,h=0; for(i=1;i<=7;i++) { if(hp[i]>h) { t=i; h=hp[i]; } } printf("%d",t); // while(1); return 0; }
RQNOJ 2 开心的金明
//本来是可以用动规做的,但是也提供另一种方法 #include <stdio.h> long int n,m; int i,v[30],p[30]; long int maxget(int free,int now) { if(now==-1) return 0; if(free-p[now]<0) return maxget(free,now-1); long int max1,max2; max1=maxget(free,now-1); max2=maxget(free-p[now],now-1)+v[now]*p[now]; if(max1>max2) return max1; else return max2; } int main() { scanf("%d %d",&n,&m); for(i=0;i<m;i++) scanf("%d %d",&p[i],&v[i]); printf("%d",maxget(n,m-1)); return 0; }
RQNOJ 147 装箱问题
//简单的01背包,可以参考饮食问题。(几乎一样,汗==) #include <stdio.h> int max(int a,int b) { if(a>b) return a; else return b; } int main() { int ca[31]={0}; int f[31][20001]; int i,r; int b; int up; scanf("%d%d",&up,&b); for(i=1;i<=b;i++) scanf("%d",&ca[i]); for(r=0;r<=up;r++) if(r<ca[1]) f[1][r]=0; else f[1][r]=ca[1]; for(i=2;i<=b;i++) for(r=0;r<=up;r++) { if(r<ca[i]) f[i][r]=f[i-1][r]; else f[i][r]=max(f[i-1][r],f[i-1][r-ca[i]]+ca[i]); } printf("%d",up-f[b][up]); return 0; }
RQNOJ 138 监考老师
//规模不大,搜吧搜吧。 #include <stdio.h> int n,m; int map[101][101]={0}; int ans[101][101]={0}; int get(int x,int y) { int sum,i; sum=0; for(i=1;i<=m;i++) sum+=map[x][i]; for(i=1;i<=n;i++) sum+=map[i][y]; return sum; } int main() { int i,r; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(r=1;r<=m;r++) scanf("%d",&map[i][r]); int max=0; for(i=1;i<=n;i++) for(r=1;r<=m;r++) if(get(i,r)>max) max=get(i,r); printf("%d",max); return 0; }