背景:贪心吧。看到会长说说说他也退役了,感伤,这几天感冒学dp无力,就来水水贪心。
学习:
1.逻辑错误,始终还是会有,对数组的处理能力需要加强,别人都是用结构体,而我是用了一个三列的数表来处理问题,看来对结构体还从未用过。
2.期间对性价比的排序用了选择排序的思想,看来算法充分理解后会自己变了用才是境界,比如快速排序中用一个key来记录数据而不是多开一个数组是很好的。
#include<stdio.h> double str[10001][3]; int main(void) { double n; int m;//max±íʾ»ñµÃµÄJavabeanµÄÖµ¡£ while(scanf("%lf %d",&n,&m)!=EOF) { double max=0; int line=m;//line±íʾÓÐЧÐÐÊý£¬f¡¾j¡¿Îª0µÄÐж¼ÎÞЧ£¬²»ÒªÇ®Ö±½ÓÂò¡£ if(n==-1&&m==-1) break; for(int i=0;i<m;++i) { scanf("%lf",&str[i][0]); scanf("%lf",&str[i][1]); if(str[i][1]==0) { max+=str[i][0]; --i; --line; --m; } else str[i][2]=str[i][0]/str[i][1];//Êý×éµÄµÚÒ»Áбíʾ·¿¼äµÄJavabeansµÄÊýÁ¿£¬µÚ¶þÁбíʾ //ʾÐèÒªµÄèʳ£¬µÚÈýÁбíʾÐÔ¼Û±È } for(int i=line;i>0;--i) { int key=0; double aa=0;//keyÓÃÀ´±£´æ×î´óÐԼ۱ȵÄÐÐϱ꣬aa±£´æ×î´óÐÔ¼Û±È for(int j=i;j>0;--j) { if(str[j-1][2]>aa) { key=j-1; aa=str[j-1][2]; } }//ÀàËÆÓÚÑ¡ÔñÅÅÐò£¬ÕÒ³öÿ´Î×î´óÐÔ¼Û±È if(str[key][1]<n) { max+=str[key][0]; n-=str[key][1]; } else { max+=n*str[key][2]; break; } str[key][0]=str[i-1][0]; str[key][1]=str[i-1][1]; str[key][2]=str[i-1][2];//×îºóÒ»×éÊý¾ÝתÒƵ½key×éÊý¾Ý£¬ÒòΪÏ´β»»á¶Áµ½×îºóÒ»×éÊý¾Ý } printf("%.3lf\n",max); } return 0; }
注解乱码!