第一题;http://acm.hdu.edu.cn/showproblem.php?pid=1257
贪心与dp傻傻分不清楚,把每一个系统的最小值存起来比较
1 #include<cstdio> 2 using namespace std; 3 int a[30001],b[30001]; 4 int main() 5 { 6 int n,i,j; 7 while (~scanf("%d",&n)) 8 { 9 int ans=0; 10 b[0]=-1; 11 for (i=0;i<n;i++) 12 { 13 scanf("%d",&a[i]); 14 for (j=0;j<=ans;j++) 15 { 16 if (a[i]<=b[j]) 17 { 18 b[j]=a[i]; 19 break; 20 } 21 if (j==ans) 22 { 23 ans++; 24 b[ans]=a[i]; 25 break; 26 } 27 } 28 } 29 printf("%d\n",ans); 30 } 31 return 0; 32 }
第二题;http://acm.hdu.edu.cn/showproblem.php?pid=1789
t组测试数据,一个人要做n完份作业,第一行是每个作业规定的最迟的提交的时间,第二行是每个作业超过规定时间提交要扣除的分数,求扣除的最小分数
将扣得分数排序,先考虑影响最大的,然后填充时间
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 struct point { 6 int time,val; 7 bool operator <(const point & q) const 8 { 9 //if (val==q.val) return q.time>time; 10 return q.val<val; 11 } 12 }; 13 point yj[1001]; 14 int vis[1001]; 15 int main() 16 { 17 int t,i,j,n; 18 scanf("%d",&t); 19 while (t--) 20 { 21 scanf("%d",&n); 22 for (i=1;i<=n;i++) 23 scanf("%d",&yj[i].time); 24 for (i=1;i<=n;i++) 25 scanf("%d",&yj[i].val); 26 sort(yj+1,yj+n+1); 27 memset(vis,0,sizeof(vis)); 28 int sum=0; 29 for (i=1;i<=n;i++) 30 { 31 for (j=yj[i].time;j>0;j--) 32 { 33 if (vis[j]==0) 34 { 35 vis[j]=1; 36 break; 37 } 38 } 39 if (j==0) 40 sum+=yj[i].val; 41 } 42 printf("%d\n",sum); 43 } 44 return 0; 45 }