贪心入门
zstu2511-Delete Number
题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2511
View Code
#include<stdio.h> #include<string.h> int main() { int n,num,T,i; char s[1001]; scanf("%d",&T); while(T--) { scanf("%d%s",&n,s); num=strlen(s); int cnt=0,x=0,y=1;//x,y表示比较的两个数的位置下标。 while(cnt<n&&y<=num) { if(s[y]<s[x]&&x>=0) { s[x]='0'-1; //'0'-1是删除标记 while(s[x]=='0'-1&&x>=0)x--; cnt++;//cnt用来记录删了几个数 } else x=y++; } int w=0,g=1; while(s[w]=='0'-1||s[w]=='0')w++;//清除结果前面多余的0; for(i=w;i<num;i++) if(s[i]!='0'-1){printf("%c",s[i]);g=0;}//g是为了修正 结果为0时无输出,反之如果无输出,答案就是0,g来检验是否有结果输出 if(g)printf("0"); printf("\n"); } return 0; }
zstu2512-均分纸牌
题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2512
View Code
#include<stdio.h> //太水了,不解释 int main() { int n,a[101],i; while(scanf("%d",&n)!=EOF&&n) { int ave=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]); ave+=a[i]; } ave/=n; int cnt=0; for(i=1;i<n;i++) if(ave!=a[i]){a[i+1]+=a[i]-ave;cnt++;} printf("%d\n",cnt); } return 0; }
zstu2513-连数问题
题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2513
解题报告:
这个题目意思应该很好理解,至少会想有两种解题思路,
一、把数组从大到小排列,这样是最大吗? 显然不是,例如:123 9,应该输出9123;
二、把数组按字符串排序,这样是最大吗?这问题可能会然我们困惑,但是这也是错的,例如:120,12;应该输出12120;
这个题目不知道毒害了多少人(当然我指的是ACM新人),尤其是第二种思路去写代码的。。这只是一个悲剧的开始,你把一条弯路在直走!
其实这个题目应该是属于动态规划的最简单应用!子问题,给你两个数,让你连成最大数,一定非常简单,只能组成两个数,比较一下大小就成!这就是解题思路!
如果给你三个数呢?一直递推下去!悲剧啊,尽然怎么简单!
View Code
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { int n,i,j,l,k; char s[1000][100],s1[100],s2[100]; while(scanf("%d",&n)!=EOF&&n!=0) { for(i=0;i<n;i++) { k=0; scanf("%s",s[i]); while(s[i][k]=='0'&&k<strlen(s[i])-1) k++;//删去“000001”等数之前的“0” strcpy(s[i],s[i]+k); } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { strcpy(s1,s[i]); strcat(s1,s[j]); strcpy(s2,s[j]); strcat(s2,s[i]); if(strcmp(s1,s2)<0) {strcpy(s1,s[i]);strcpy(s[i],s[j]);strcpy(s[j],s1);} } for(i=0;i<n;i++) if(s[0][0]=='0'){printf("0");break;}//判断输入是否都为0,只要判断第一个是不是0; else printf("%s",s[i]); printf("\n"); } return 0; }
zstu2514-computer arrangment
题目来源:http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=2514
解题报告:输入的每组开始结束时间 以结束时间进行从小到大排序,我这里用了sort对结构体进行排序,也可以写最朴素的冒泡。
View Code
#include<stdio.h> #include<algorithm> //STL using namespace std; struct node { int s,e;//s start ,e end }a[1001]; bool cmp(node a,node b) { return a.e<b.e; } int main() { int T,i,j,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i].s); for(i=0;i<n;i++) scanf("%d",&a[i].e); sort(a,a+n,cmp); //sort排序 int cnt=1,x=0,k=0; for(i=1;i<n;i++) { if(a[k].e<=a[i].s){cnt++;k=i;} } printf("%d\n",cnt); } }
Hdu1009-FatMouse' Trade
View Code
#include<stdio.h> #define maxn 1002 int F[maxn],J[maxn]; int main() { int m,n,i,j; while(scanf("%d%d",&m,&n)!=EOF) { if(m==-1&&n==-1)break; for(i=0;i<n;i++) { scanf("%d%d",&J[i],&F[i]); } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(J[i]*F[j]<J[j]*F[i]) { int temp=J[i];J[i]=J[j];J[j]=temp; temp=F[j];F[j]=F[i];F[i]=temp; } double cnt=0; for(i=0;i<n;i++) { if(m<=F[i]){cnt+=(double)J[i]/F[i]*m;break;} else {cnt+=J[i];m-=F[i];} } printf("%.3f\n",cnt); } return 0; }


浙公网安备 33010602011771号