Programación de pensamiento y práctica CSP-M2 preguntas suplementarias (3/4 / clase de datos)

Programación de pensamiento y práctica CSP-M2 preguntas suplementarias (3/4 / clase de datos)

Secuencia A de HRZ

Análisis de problemas

El título es que la secuencia se compone de tres números diferentes como máximo. Cuando se compone de tres tipos de números, se requiere que estos tres números se ordenen para formar una secuencia aritmética; cuando se compone de dos o un tipo de números, se establece directamente.

Puede usar STL para setatravesar la secuencia, y cada número se agrega a la colección. Si la colección es sizemayor que 3, no es cierto, escriba "NO". En otros casos, use un iterador para extraer cada número y ponerlo en la matriz para ordenar. Para tres dígitos, "SÍ" debe aparecer en la secuencia aritmética, de lo contrario, "NO".

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll a;
	int t,n;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		set<ll>s;
		while(n--){
			scanf("%lld",&a);
			s.insert(a);
		}
		int var=s.size();
		switch(var){
			case 0:{
				return -1;
				break;
			}
			case 1:{
				printf("YES\n");
				break;
			}
			case 2:{
				printf("YES\n");
				break;
			}
			case 3:{
				ll a[3];
				int i=0;
				set<ll>::iterator iter;
				for(iter=s.begin();iter!=s.end();++iter){
					a[i++]=*iter;
				}
				sort(a,a+i);
				if(a[1]-a[0]==a[2]-a[1]){
					printf("YES\n");
				}
				else{
					printf("NO\n");
				}
				break;
			}
			default:{
				printf("NO\n");
				break;
			}
		}
	}
	return 0;
} 

B-HRZ Aprende inglés

Análisis de problemas

Comenzando con la primera letra, se determina una secuencia de longitud 26.

Se requiere que cada letra mayúscula aparezca 0 veces o 1 vez. En cada párrafo, la suma de las letras mayúsculas y "?" Se requiere que sea 26.

Al generar, desde el principio hasta el final, la salida en orden, para garantizar el orden lexicográfico más pequeño.

#include<bits/stdc++.h>
using namespace std;
int main(){
	string str;
	cin>>str;
	int l=0,r=25;
	int len=str.length();
	while(r<len){
		int letter[27]={};
		int p=l;
		while(p<=r){
			if(str[p]=='?'){
				letter[26]++;
			}
			else{
				letter[str[p]-'A']++;
				if(letter[str[p]-'A']>1){
					break;
				}
			}
			p++;
		}
		p--;
		if(p==r){
			int index=0;
			int i=l;
			while(i<=r){
				if(str[i]!='?'){
					cout<<str[i];
				}
				else{
					while(letter[index]!=0){
						index++;
					}
					cout<<(char)('A'+index);
					index++;
				}
				i++;
			}
			return 0;
		}
		l++;
		r++;
	}
	cout<<"-1"<<endl;
	return 0;
}

C-La maravillosa secuencia de Gugudong

Análisis de problemas

Malentendido: Al principio, pensé que la fórmula general de la serie de inspección de preguntas escribió directamente el siguiente código:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void Query(ll n)
{
	ll group=0;
	while(group*(group+1)/2<n){
		group++;
	}
	group--;
	n-=(group*(group+1)/2);
	printf("%lld\n",n);
}
int main()
{
	ll n;
	ll d;
	scanf("%lld",&n);
	while(n--){
		scanf("%lld",&d);
		Query(d);
	}
	return 0;
} 

Este código es para el índice de un cierto número, pero el "número" requerido por la pregunta se refiere al número, por ejemplo ... 11 12 13
estos, de acuerdo con el código anterior, se consideran tres números, de hecho, el problema Piense en esto como seis números.

Solución positiva: hay muchas formas de entender, muchas personas lo entienden como un trapecio hecho de números, lo cual es más intuitivo.

La clave es determinar el número de cada grupo.

Por ejemplo, un grupo tiene {11} {12} {13}, que se consideran tres elementos, y hay dos números en cada elemento. Encuentre el enésimo número de toda la secuencia, es fácil determinar a qué "grupo" pertenece, encontrar el i-ésimo número de este grupo y luego determinar a qué "elemento" pertenece. Aunque el código anterior es incorrecto, aún contribuye a resolver el problema.

#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
void Work() {
    LL n;
    scanf( "%lld", &n );
    LL LastLen = 0, Len, Count;
    for( Len = 1; ; ++Len ) {
        Count = 9;
        for( LL i = 1; i < Len; ++i ) 
            Count = Count * 10;
        LL Sum = ( LastLen + Len + LastLen + Count * Len ) * Count / 2;
        if( n <= Sum ) break;
        n -= Sum;
        LastLen += Count * Len;
    }
    LL Left = 1, Right = Count, Mid, Ans;
    while( Left <= Right ) {
        Mid = ( Left + Right ) >> 1;
        LL Sum = ( LastLen + Len + LastLen + Mid * Len ) * Mid / 2;
        if( Sum >= n ) {
            Ans = Mid;
            Right = Mid - 1;
        } else Left = Mid + 1;
    }
    --Ans;
    n -= ( LastLen + Len + LastLen + Ans * Len ) * Ans / 2;
    ++Ans;
    for( Len = 1; ; ++Len ) {
        Count = 9;
        for( LL i = 1; i < Len; ++i ) 
            Count = Count * 10;
        LL Sum = Count * Len;
        if( Sum >= n ) break;
        n -= Sum;
    }
    LL Num = ( n + Len - 1 ) / Len;
    n = n - ( Num - 1 ) * Len;
    LL T = 1;
    for( LL i = 1; i < Len; ++i ) T = T * 10;
    Num = T + Num - 1;
    T = Len - n + 1;
    for( LL i = 1; i < T; ++i ) Num = Num / 10;
    printf( "%lld\n", Num % 10 );
    return;
}
 
int main() {
    LL Query;
    scanf( "%lld", &Query );
    for( LL i = 1; i <= Query; ++i ) Work();
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/master-cn/p/12726214.html
Recomendado
Clasificación