hdu 1257 && hdu 1789(简单DP或贪心)

第一题;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 }
时间: 2024-12-26 10:36:12

hdu 1257 && hdu 1789(简单DP或贪心)的相关文章

HDU - 1257 最少拦截系统(dp或贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 题意:中文题 题解: 1.dp:题目问最少有几个最长递减子序列,反过来想就是求这个序列中的最长递增子序列的长度为多少. 其实就是变化点造成出现新的序列,然后把变化点放在一起就是最长递增序列啦. 然后就是一道简单的LIS了. 1 //hdu1257 2 //状态转移方程: dp[i]=max(dp[i],dp[j]+1); 3 #include <iostream> 4 #include &l

poj 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心

参考链接:http://blog.csdn.net/xiaohuan1991/article/details/6956629 (HDU 1257 解题思路一样就不继续讲解) POJ 1065题意:给你n个木块,分别给出其长度和重量,然后要对这些木块进行加工,如果木块1的长度和重量都不大于木块2, 那么这两个木块可以放在一起加工,从而只用花费1个时间单位.问要如何进行加工从而能够花费最少时间单位. 知识点: 偏序集:若一个集合A为偏序集,那么满足:1.任意一个元素X属于集合,那么这个元素X≤X 2

HDU 2084 数塔(简单DP入门)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41852    Accepted Submission(s): 24820 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

hdu 1003 Max Sum 简单DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 转移方程:dp[i]=max(dp[i-1]+a[i],a[i]) 虽然是dp 但不用真的申请一个dp数组 #include <cstdio> #include <cstdlib> #include <ctime> #include <iostream> #include <cmath> #include <cstring> #in

hdu 5092 Seam Carving 简单DP ”水一炮试试“大法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5092 非常卡读题 题目中说可以八个方向地走,完全没有提及是从上往下的 需要从样例中猜测”可能只是从上往下“,然后根据现场的过题情况决定要不要水一发试试 对于”水一炮试试“,感觉一般适用于: 1.本题的其他做法未果/很难写,其他的题目没法出 2.码的成本不会很高 3.心态上,得之我幸,失之我命 (水不过的时候,再检查一下水的姿势有没有什么不妥,如果还是不行,就要勇敢地.果断地走出过不了题的不开心-)

hdu 2084 数塔 (简单dp)

http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 28668    Accepted Submission(s): 17230 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下

HDU 1260 Tickets(简单DP)

[题意简述]: 输入: 2 2 20 25 40 1 8 输出: 这里的数据依次表示的意思为:第一个2,代表两组数据,然后下面的2表示两个人,如果单买票的话,其中第一个人会花费20S,另一个人会花费25S,如果两人一起买要花费40S(注意这里的两人一起买必须是相挨着的两个人才可以),因为题目是求得是最短的时间是多少,所以输入40S.具体的时间就是: 08:00:40 am 另一个就不再赘述. [分析]:对于求最短的时间,求最优解,我们可以很简单的建立状态转移方程: dp[i] = min(dp[

hdu 1257 最少拦截系统 dp

简单的dp,只要把每个系统的导弹当前最低高度保存一下,以后得导弹都用最小值比他大的系统中最小值最小的就 ok啦.每次要么更新原来系统最低高度,要么加进去一个新系统... 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set> #incl

hdu 2154 跳舞毯(简单DP)

题意: 有一个圆圆的毯,被平均分成三个扇形.分为标记为A,B,C. 小余从A开始跳,每次可跳到相邻的扇形上.(A->B 或 A->C) 问小余跳n次,最后回到扇形A的方案数是多少. 思路: A,B,C是三个状态.我们画一棵生长的树,一层一层下来,然后发现每一层上其实最多就只有三种状态.所以明显是可以用DP解喽 直接看代码., 代码: int main(){ int n; int f[1005][5]; while(cin>>n,n){ f[0][0]=1; f[0][1]=0; f