Codeforces Round # 634 (Div. 3) Ergänzende Fragen


A.
Fragen zum Einchecken von Süßigkeiten und zwei Schwestern , direkt ausgegeben

Code
#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. Konstruieren Sie die Stringlänge
a enthält b verschiedene Buchstaben, geben Sie einfach die ersten b Buchstaben in einer Schleife aus.

Code

#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. Zwei zusammengesetzte Teams zählen
die Anzahl jedes Elements und zeichnen die maximale Anzahl aller Elemente auf. Wenn die größte Anzahl von Elementen x ist, werden die beiden Warteschlangen auf zwei Arten aufgebaut: Das erste Team enthält kein x, das zweite Team ist alles x, das erste Team enthält x und das zweite Team ist alles x, vergleichen Sie die beiden Der Maximalwert des Ergebnisses der Bauweise ist ausreichend.

Code

#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
Meine Idee ist, dass jedes der neun kleinen Quadrate eine Zahl ändern muss, damit die geänderte Zahl eine Zeile und eine Spalte betreffen kann, und schließlich die neun Zahlen die verschiedenen Zeilen und Spalten beeinflussen lassen. Für verschiedene Sudoku kann die Position der Änderung festgelegt werden, und die Änderungsmethode kann darin bestehen, die Anzahl um eins zu erhöhen.
Die in der Antwort angegebene Methode ist sehr clever. Machen Sie einfach alle Zahlen in Sudoku zu anderen Zahlen, zum Beispiel werden alle 2 zu 1

Code
#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. Drei Blöcke Palindrome (einfache Version)
dachte nur während des Spiels an die Lösung von E1 und musste sie achtmal bezahlen. . .
Meine Idee ist es, die Präfixsumme (Nummer) für jedes Element einmal beizubehalten, damit die Nummer jedes Elements innerhalb eines bestimmten Bereichs leicht ermittelt werden kann. Die für den Titel erforderliche Reihenfolge ist in drei Teile unterteilt. Mein Ansatz besteht darin, den Mittelteil zu fixieren und dann die maximale Anzahl von Elementen auf beiden Seiten zu durchlaufen, da dies die linken und rechten Grenzen l und r des Mittelteils sind. Die Komplexität des Durchlaufens von l und r ist n2.

Code

#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 Palindrom mit drei Blöcken (harte Version)
Tatsächlich entspricht die erste Hälfte der Skala auch der Anzahl der Wartungspräfixe. Letzteres entspricht jedoch dem Fixieren der beiden Seiten während der Lösung, dem Durchqueren des Mittelteils und dem Zählen der Position jedes Elements während der Vorverarbeitung. Wenn Sie gemäß der Elementdurchquerung lösen, zählen Sie zuerst die Anzahl solcher Elemente auf [1, n] und nehmen Sie dann jedes dieser Elemente c, um die Position des linken und rechten Endes des Mittelteils zu erhalten.

Code
#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. Roboter auf einem Gitter
Die oben angegebene Figur besteht aus einigen Ringen, andernfalls geht der Roboter bis zu dem Punkt, der nicht passiert wurde, und die Größe der Figur ist begrenzt. Wenn sich die beiden Roboter zu einem bestimmten Zeitpunkt treffen, gehen sie anschließend zusammen, was in der Frage nicht zulässig ist, da die maximale Dauer des Rings n * m nicht überschreitet, solange sich die beiden Roboter nicht in n * m Schritten treffen Dann können sie sich nicht treffen. Zählen Sie, wo sich der Roboter in jedem Gitter nach n * m Schritten befindet. Danach können Sie ermitteln, wie viele Roboter im Gitter nach n * m Schritten zu einem bestimmten Gitter gelangen können und wie viele Roboter im schwarzen Gitter gehen können Ein schwarzes Gitter kann die Antwort leicht berechnen, und wenn der Roboter auf jedem Gitter n * m Schritte ausführt, tritt offensichtlich eine Zeitüberschreitung auf, sodass die Multiplikationsmethode verwendet wird.

Code
#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;
}
 

Ich denke du magst

Origin www.cnblogs.com/DinoMax/p/12702321.html
Empfohlen
Rangfolge