Codeforces Round # 634 (Div. 3) Preguntas suplementarias


A.
Preguntas sobre el check-in de Caramelos y Dos Hermanas , salida directa

Código
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		int n;
		read(n);
		int t=n/2;
		cout<<n-t-1<<endl;
	}
 	return 0;
}



B. Construya la
longitud de la cadena a que contiene b letras diferentes, simplemente envíe las primeras letras b en un bucle.

Código

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		int n,a,b;
		read(n),read(a),read(b);
		int k=a/b;
		int cnt=0;
		bool flag=true;
		for(;;){
			for(int i=0;i<b;i++){
				for(int j=0;j<k;j++){
					putchar('a'+i);
					if(++cnt==n){
						flag=false;
						break;
					}
				}
				if(!flag) break;
			}
			if(!flag) break;
		}
		putchar('\n');
	}
 	return 0;
}



C. La composición de dos equipos
cuenta el número de cada elemento y registra el número máximo de todos los elementos. Si el mayor número de elementos es x, entonces las dos colas se construyen de dos maneras: el primer equipo no contiene x y el segundo equipo es todo x; el primer equipo contiene xy el segundo equipo es todo x, compare los dos El valor máximo del resultado del método de construcción es suficiente.

Código

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
map<int,int> a;
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		int n;
		int m=0;
		int sum=0;
		read(n);
		//map<int,int> a;
		a.clear();
		for(int i=0;i<n;i++){
			int t;
			read(t);
			if(!a[t]) sum++;
			a[t]++;
			m=max(m,a[t]); 
		}
		cout<<max(min(sum-1,m),min(sum,m-1))<<"\n";
	}
 	return 0;
}



D. Anti-Sudoku
Mi idea es que cada uno de los nueve cuadrados pequeños debe cambiar un número, para que el número modificado pueda afectar una fila y una columna, y finalmente dejar que los nueve números afecten a las diferentes filas y columnas. Para diferentes Sudoku, la posición del cambio puede ser fija, y el método de cambio puede ser aumentar el número en uno.
El método dado por la respuesta es muy inteligente, solo haz que todos los números en Sudoku se conviertan en otros números, por ejemplo, los 2 se convierten en 1

Código
#define LOCAL0
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
vector<vector<int> > a(10,vector<int>(10)); 
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		char s;
		for(int i=1;i<=9;i++)
			for(int j=1;j<=9;j++){
				cin>>s;
				a[i][j]=s-'1';
			}
		a[1][1]=(a[1][1]+1)%9;
		a[2][5]=(a[2][5]+1)%9;
		a[3][9]=(a[3][9]+1)%9;
		
		a[5][2]=(a[5][2]+1)%9;
		a[6][6]=(a[6][6]+1)%9;
		a[4][7]=(a[4][7]+1)%9;

		a[9][3]=(a[9][3]+1)%9;
		a[7][4]=(a[7][4]+1)%9;
		a[8][8]=(a[8][8]+1)%9;

		for(int i=1;i<=9;i++)
		{
			for(int j=1;j<=9;j++)
				printf("%d",a[i][j]+1);
			putchar('\n');
		}
	}
 	return 0;
}



E1. El Palindrome de tres bloques (versión fácil)
solo pensó en la solución de E1 durante el juego, y tuvo que pagarlo ocho veces. . .
Mi idea es mantener el prefijo sum (número) para cada elemento una vez, de modo que se pueda obtener fácilmente el número de cada elemento dentro de un cierto rango. La secuencia requerida por el título se divide en tres partes. Mi enfoque es fijar la parte media y luego atravesar el número máximo de elementos en ambos lados, porque son los límites izquierdo y derecho l y r de la parte media. La complejidad de atravesar l y r es n2.

Código

#include <iostream>
#include<vector>
#include<map>
#include<queue>
#include<set>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
//map<int,int> idx;
int sum[30][3000];
int idx[300];
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		int n,cnt=0,ans=0;
		read(n);
		memset(idx,0,sizeof(idx));
		memset(sum,0,sizeof(sum));
		for(int i=1;i<=n;i++){
			int v;
			read(v);
			if(!idx[v]) idx[v]=++cnt;
			for(int j=1;j<=cnt;j++){
				sum[j][i]=sum[j][i-1];
				if(idx[v]==j) sum[j][i]++;
			}
		}
			
		for(int l=1;l<=n;l++)
			for(int r=l;r<=n;r++){
				for(int i=1;i<=cnt;i++)
					for(int j=1;j<=cnt;j++){
						//if(l!=1&&j==i) continue;
						ans=max(ans,sum[i][r]-sum[i][l-1]+2*min(sum[j][n]-sum[j][r],sum[j][l-1]));
						//cout<<l<<" "<<r<<" "<<ans<<endl;
					}
			}
		for(int i=1;i<=cnt;i++) ans=max(ans,sum[cnt][n]);
		cout<<ans<<"\n";
	}
 	return 0;
}
 

E2. Palindrome de tres bloques (versión dura)
De hecho, la primera mitad de la escala también es el número de prefijos de mantenimiento, pero este último es equivalente a fijar los dos lados durante la solución, atravesar la parte media y contar la posición de cada elemento durante el preprocesamiento. Al resolver, de acuerdo con el recorrido del elemento, primero cuente el número de tales elementos en [1, n], y luego tome cada uno de estos elementos c, puede obtener la posición de los extremos medio e izquierdo.

Código
#include <iostream>
#include<vector>
#include<map>
#include<queue>
#include<set>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
int sum[30][3000];
int idx[300];
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		int n;
		read(n);
		vector<int> a(n+1);
		vector<vector<int> > pref(201,vector<int>(n+1));
		vector<vector<int> > pos(201);
		for(int i=1;i<=n;i++) read(a[i]);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=200;j++) pref[j][i]=pref[j][i-1];
			pref[a[i]][i]++;
			pos[a[i]].push_back(i);
		}
		int ans=0;
		for(int i=1;i<=200;i++){
			int u=pos[i].size();
			ans=max(ans,u);
			for(int j=1;2*j<=u;j++){
				int l=pos[i][j-1];
				int r=pos[i][u-j];
				for(int k=1;k<=200;k++){
					if(k==i) continue;
					ans=max(ans,2*j+pref[k][r-1]-pref[k][l]);
				}
			}
		}
		cout<<ans<<"\n";
	}
 	return 0;
}
 

F. Robots en una cuadrícula
La figura anterior se compone de algunos anillos, de lo contrario el robot irá hasta el punto que no se ha pasado, y el tamaño de la figura es limitado. Si los dos robots se encuentran en un momento determinado, caminarán juntos después, lo cual es la condición no permitida en la pregunta, porque el período máximo del anillo no excede n * m, siempre que los dos robots no se encuentren en n * m pasos Entonces no pueden encontrarse. Cuente dónde estará el robot en cada cuadrícula después de n * m pasos, después de lo cual puede obtener cuántos robots en la cuadrícula pueden ir a una determinada cuadrícula después de n * m pasos, y cuántos robots en la cuadrícula negra pueden ir Una cuadrícula negra puede calcular fácilmente la respuesta, y dejar que el robot en cada cuadrícula tome n * m pasos obviamente expirará, por lo que se utiliza el método de multiplicación.

Código
#include <iostream>
#include<vector>
#include<map>
#include<queue>
#include<set>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
inline void read(int &p)
{
    p=0;int flag=1;char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
}
int sum[30][3000];
int idx[300];
int main()
{
	#ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
	int q;
	read(q);
	while(q--){
		int n,m;
		read(n),read(m);
		vector<int> col(n*m),dp(n*m),dpn(n*m),ans(n*m),co(n*m);
		string s;
		for(int i=0;i<n;i++){
			cin>>s;
			for(int j=0;j<m;j++){
				col[i*m+j]=(s[j]=='0');
			}
		}
		for(int i=0;i<n;i++){
			cin>>s;
			for(int j=0;j<m;j++){
				int nxt=-1;
				if(s[j]=='U') nxt=(i-1)*m+j;
				if(s[j]=='D') nxt=(i+1)*m+j;
				if(s[j]=='L') nxt=i*m+j-1;
				if(s[j]=='R') nxt=i*m+j+1;
				dp[i*m+j]=nxt;
			}
		}
		int k=0;
		n*=m;
		while((1<<k)<=n) k++;
		while(k--){
			for(int i=0;i<n;i++){
				dpn[i]=dp[dp[i]];
			}
			for(int i=0;i<n;i++){
				dp[i]=dpn[i];
			}
		}
		for(int i=0;i<n;i++){
			ans[dp[i]]++;
			co[dp[i]]+=col[i];
		}
		int res=0,_res=0;
		for(int i=0;i<n;i++){
			if(ans[i]) res++;
			if(co[i]) _res++;
		}
		cout<<res<<" "<<_res<<"\n";
	}
 	return 0;
}
 

Supongo que te gusta

Origin www.cnblogs.com/DinoMax/p/12702321.html
Recomendado
Clasificación