Codeforces Round # 693 (concurso 1472)

Tabla de contenido

 

UN

segundo

C

re

mi


 

UN:

https://codeforces.com/contest/1472/problem/A

Idea: El número de cortes horizontales y verticales de una hoja de papel es fijo, solo multiplícalo.

#include<iostream>
#include<cmath>
#define ll long long
using namespace std;

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		ll w,h,n;

		scanf("%lld%lld%lld",&w,&h,&n);
		int ww=0,hh=0;

		while(w % 2 == 0){ww++;w/=2;}
		while(h % 2 == 0){hh++;h/=2;}

		ww = pow(2,ww);
		hh = pow(2,hh);
		ll maxn = ww*hh;

		if(maxn>=n)
			cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
		
	}
	return 0;
}

 

SEGUNDO:

https://codeforces.com/contest/1472/problem/B

Idea: Si la suma de los pesos de todos los azúcares es un número impar, pase lo que pase, es imposible dividirlos. Si el total es un número par, es necesario juzgar si el resultado después de dividir por dos es un número par o impar.

Si el resultado es un número par, se puede dividir. Si el resultado es un número impar, cada dos unos juntos puede ser equivalente a un 2, y la composición de un número impar es un grupo de números pares, simplemente sume uno , siempre que el número de unos en el número dado sea mayor o igual a 2, es decir Se puede realizar la estructura del método de división impar.

#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		int s1=0,s2=0,sum=0;
		for(int i=1;i<=n;i++)
		{
			int t;
			scanf("%d",&t);
			if(t == 1) s1++;
			if(t == 2) s2++;
		}
		sum = s1+2*s2;
		if(sum % 2 == 1)
		{
			cout<<"NO"<<endl;
			continue;
		}
		int each = sum/2;
		if(each % 2 == 1)
		{
			if(s1>=2)
			{
				cout<<"YES"<<endl;
				continue;
			}
			else
			{
				cout<<"NO"<<endl;
				continue;
			}
		}
		if(each % 2 == 0)
		{
			cout<<"YES"<<endl;
			continue;
		}
	}
	return 0;
}

 

C:

https://codeforces.com/contest/1472/problem/C

Idea: Después de comprender el significado de la pregunta, ejecute la simulación y registre el valor máximo. ¡Pero preste atención a la optimización! Orden inverso para recorrer (similar a la forma de memorización, la respuesta desde este punto hasta el último salto se almacena en el índice correspondiente de la matriz ta, y el punto anterior puede saltar a él y leer el valor directamente para optimizar la complejidad del tiempo)

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;

ll a[200005],ta[200005];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
		ll mmax = -1;

		for(int i=n;i>=1;i--)
		{
			ll tans=0;
			int crs=i;
			
			tans+=a[crs];
			if(crs+a[crs]<=n)
				tans += ta[crs+a[crs]];
			
			ta[crs] = tans;
			mmax = max(mmax,tans);
		}
		cout<<mmax<<endl;
	}
	return 0;
}

 

RE:

https://codeforces.com/contest/1472/problem/D

Ideas: teoría de juegos, pensamiento codicioso, para asegurarse de que cada paso sea la mejor opción para usted. Ordene primero, obviamente comenzando con el más grande. Cuando sea tu ronda, puedes elegir elegir el número que te sumará puntos, o elegir el número más grande del oponente en este momento (cuando el oponente elija este número, será más desfavorable para ti que la elección actual de tu propio número: Cuando el número máximo en este momento sea mayor que su propio número máximo en este momento, elija el número máximo del oponente en este momento). PD: Prefiero no agregar puntos a otros que dejar que otros agreguen más puntos. . Orz demasiado codicioso

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 200005
using namespace std;


ll ev[N],od[N];
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		int evn=0,odn=0;
		for(int i=1;i<=n;i++)
		{
			ll t;
			scanf("%lld",&t);
			if(t % 2 == 0)
			{
				evn++;
				ev[evn]=t;
			}
			else
			{
				odn++;
				od[odn]=t;
			}
			
		}
		sort(ev+1,ev+evn+1);
		sort(od+1,od+odn+1);


		ll aans=0,bans=0;
		int evc=evn,odc=odn;
		for(int i=1;i<=n;i++)
		{
			
			if(i%2 == 1) // alice
			{
				if(evc>=1 && ev[evc]>=od[odc])
				{
					aans+=ev[evc];
					evc--;
				}
				else
				{
					odc--;
				}
			}
			else  // bob
			{
				if(odc>=1 && od[odc]>=ev[evc])
				{
					bans+=od[odc];
					odc--;
				}
				else
				{
					evc--;
				}
			}

		}

		if(aans == bans)
		{
			cout<<"Tie"<<endl;
		}

		if(aans > bans)
		{
			cout<<"Alice"<<endl;
		}
		if(aans < bans)
		{
			cout<<"Bob"<<endl;
		}
	}
	return 0;
}

 

 

MI:

https://codeforces.com/contest/1472/problem/E

Ideas: Ya sea sentado acostado, se unifican ya que la primera dimensión (x) es el número tanto de pequeña como de mediana, y la segunda dimensión (y) es tanto grande en número, como ascendente ax, y procesamiento de orden descendente, muy Ingeniosamente , este método se utiliza para garantizar que el valor y del punto marcado por tid sea el más pequeño en el estado actual (porque x está ordenado, por lo que x debe ser menor que), para juzgar, si cumple con los requisitos del título Registre la respuesta y actualice el valor tid (para obtener un valor b menor) si no se satisface, logrando así una reducción en la complejidad del tiempo.

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct peo{
	long long x,y;
	long long id;
}p[300005];
long long ans[300005];

bool cmp(peo a,peo b)
{
	if(a.x == b.x)
		return a.y>b.y;
	return a.x<b.x;
}

int main()
{
	long long T;
	cin>>T;
	while(T--)
	{
		long long n;
		scanf("%lld",&n);
		long long ta,tb;
		for(long long i=1;i<=n;i++)
		{
			scanf("%lld%lld",&ta,&tb);
			p[i].id=i;
			p[i].x=min(ta,tb);
			p[i].y=max(ta,tb);
		}
		sort(p+1,p+n+1,cmp);
		
		int tid=1;
		for(long long i=1;i<=n;i++)
		{
			long long t=-1;
			if(p[i].y > p[tid].y)
				{t=p[tid].id;}
			if(p[i].y < p[tid].y)
				{tid=i;}
			ans[p[i].id] = t;
			//printf("%s\n", );
			
		}
		for(long long i=1;i<=n;i++)
		{
			printf("%lld",ans[i]);
			if(i!=n) printf(" ");
		}
		cout<<endl;

	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/ShuoCHN/article/details/112419111
Recomendado
Clasificación