HDU —— 1029 Ignatius and the Princess IV (STL / programación dinámica)

Enlace a la pregunta original: http://acm.hdu.edu.cn/showproblem.php?pid=1029

Inserte la descripción de la imagen aquí
Muestra de prueba

Entrada de muestra
5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1
Salida de muestra
3
5
1

Pregunta: Darle un NN extrañoN secuencia entera de longitud, necesita encontrar uno de los elementos, aparece al menos(N + 1) / 2 (N + 1) / 2( N+1 ) / 2 veces.

Ideas de resolución de problemas: aquí tenemos dos formas de solucionarlo. Primero, déjame hablar de la solución popularEs decir, usar el contenedor del mapa para resolver, registramos cada entrada y juzgamos que cumple con los requisitos. Almacene los valores que cumplan con los requisitos,La salida final puede ser. Es fácil de entender. Entonces otro método es la programación dinámica. Este método es muy inteligente, primero debemos determinar el hecho de que solo un elemento que cumpla con los requisitos puede aparecer en esta secuencia de números enteros. Porque aparece al menos (N + 1) / 2 (N + 1) / 2( N+1 ) / 2 veces. Entonces podemos establecer este elemento comoresultador e s u l t , entonces el número de veces que aparece escnt cntc n t . Piénselo de nuevo, en los primeros2k 2k2 k números, si ninguno de los números aparece más dekkk , entonces este número debe estar en losN - 2 k N-2krestantesnorte-Aparece en 2 k números. Por lo tanto, podemos juzgar que cuando el valor de entrada no es igual al elemento que asumimos en ese momento, entonces el número de ocurrencias se reduce, y si lo es, aumenta. El propósito de esto es juzgar si tenemos un elemento que puede aparecer más de la mitad durante el proceso de selección. Entonces tenemoscnt = 0 cnt = 0c n t=En 0 necesitamos cambiar nuestro valor asumido porque ya no es posible. OK, mira el código específicamente.

Código STL AC

/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h>	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int n,temp;
int main(){
    
    
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	while(cin>>n){
    
    
		int result;
		map<int,int> p;
		rep(i,0,n-1){
    
    
			cin>>temp;
			if(++p[temp]>=(n+1)/2){
    
    
				result=temp;
			}
		}
		cout<<result<<endl;
	}
	return 0;
}

Código de CA de programación dinámica

/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h>	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int n,temp,result,cnt;
int main(){
    
    
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	while(cin>>n){
    
    
		cnt=0;
		rep(i,1,n){
    
    
			cin>>temp;
			if(cnt==0){
    
    
				result=temp;
				cnt++;
			}
			else{
    
    
				if(temp==result){
    
    
					cnt++;
				}
				else{
    
    
					cnt--;
				}
			}
		}
		cout<<result<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/hzf0701/article/details/108986171
Recomendado
Clasificación