HDU 1029 基础dp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1029 基础dp相关的知识,希望对你有一定的参考价值。

题目链接:Ignatius and the Princess IV

大意:就是在N个数里找出唯一一个至少出现过(N+1)/ 2 次的数。 1 <= N <= 999999。

hash:

技术分享
 1 /*
 2   题意好懂。就是在N个数里找出唯一一个至少出现过(N+1)/ 2 次的数。 1 <= N <= 999999.
 3   如果我用一个map 标记的话。大概也只是10^6吧。
 4   然而还是卡了cin 和 cout。
 5  */
 6 
 7 #include <stdio.h>
 8 #include <string.h>
 9 #include <iostream>
10 #include <map>
11 using namespace std;
12 
13 map<int, int>mp;
14 
15 int main() {
16     int n;
17     int num;
18     int ans;
19 
20     while(~scanf("%d", &n)) {
21         mp.clear();
22         for (int i=0; i<n; ++i) {
23             scanf("%d", &num);
24             mp[num]++;
25             if (mp[num] >= (n+1)/2) { // 找到了也不能break。因为可能还没有输入完、
26                 ans = num;
27             }
28         }
29         printf("%d\n", ans);
30     }
31     return 0;
32 }
View Code

dp:

技术分享
 1 /*
 2  get到一个很巧妙的方法。按照题意。我求的那个数是素有数里出现的次数最多的,
 3  每次只拿当前的数和前面的所有数里出现次数最多的数比较。
 4  从过程来看?就是这道题的动态规划?
 5  */
 6 
 7 #include <stdio.h>
 8 #include <string.h>
 9 #include <string.h>
10 #include <iostream>
11 using namespace std;
12 
13 int main() {
14     int n;
15     int num, cnt, rem;
16     while(~scanf("%d", &n)) {
17         cnt = 0;
18         for (int i=0; i<n; ++i) {
19             scanf("%d", &num);
20             if (cnt == 0) { // 计数
21                 rem = num;
22                 cnt = 1;
23             }
24             else if (num == rem) {
25                 cnt++;
26             }
27             else {
28                 cnt--;
29             }
30         }
31         printf("%d\n", rem);
32     }
33     return 0;
34 }
View Code

 

以上是关于HDU 1029 基础dp的主要内容,如果未能解决你的问题,请参考以下文章

HDU1029 简单DP

[kuangbin]专题12 基础DP

HDOJ/HDU 1029 Ignatius and the Princess IV(简单DP,排序)

HDU1029:Ignatius and the Princess IV(找出数组中出现次数超过一半的数字)

HDU-1029-Ignatius aned the Princess IV

URAL 1029 Ministry