# 401 라운드 Codeforces (사업부. 2) (A, B, C, D, E)

주제 링크

A. 쉘 게임

질문의 의미 : 게임, 각각 세 개의 오른쪽으로 위치와 왼쪽, 교환 카드 3 장 012, 홀수 교환이 왼쪽 숫자, 심지어 여러 번 잘 수있다. 라운드 요청 후 제 N 디지털 X 번째 위치이다.

해결 방법 : 아날로그, 스크래치 종이에 다시 직접주기 매 6를 찾을 수 있습니다. (6 개는 0, WA 개의 머리 qwq)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long  n,k;
	cin>>n>>k;
	n=n%6;
	if(n==0) n=6;
	if(k==0){
		if(n<=2) puts("1");
		else if(n<=4) puts("2");
		else puts("0");
	}
	else if(k==2){
		if(n==3||n==2) puts("0");
		else if(n==4||n==5) puts("1");
		else puts("2");
	}
	else {
		if(n==1||n==4) puts("0");
		else if(n==2||n==5) puts("2");
		else puts("1");
	}
}

 

 

신용 카드의 B. 게임

질문의 의미 : 두 사람이 동일한 길이의 시퀀스를 가지고있다. 첫 번째 번호는 개인 사용자 초보다 크면, i 번째의 비트에서, 첫 번째 사람은 얻었다 반대로 긋기 번째 사용자 제스처를 얻었다. 이제 두 번째 시퀀스의 모든 종류의, 그리고, 정렬 제스처에게 이상을 얻을 수있는 두 번째 사람을 만들 수있는 방법을 질문 할 수 있습니다. 어떤 종류의 제스처 것은 사용할 수있는 첫 번째 사람까지 만들 수 있습니다. 이 두 가지 문제로 정렬하는 것은 다를 수 있습니다.

해결 방법 : 욕심 제목입니다. 질문 두 번째 정렬 순서 만 요구하지만, 사실도 정렬 할 수 있지만 첫 번째 시퀀스 (두 번째 순서 정렬에 해당하는 첫 번째 시퀀스의 일종이다, 그것에 대해 생각)을. 따라서이 시퀀스는 소형에서 대형에 있습니다. 첫 번째 문제를 들어 제 1 시퀀스 어레이를 가로 지르는 나머지의 제 2 시퀀스 번호가 [I]가보다 더 식별한다. 두번째 문제 : 제 찾을 라인에 [I]보다 크다.

#include<bits/stdc++.h>
using namespace std;
const int maxn =1010;
char s1[maxn],s2[maxn];
int a1[maxn],a2[maxn];
int main()
{
	int n;
	cin>>n>>s1+1>>s2+1;
	for(int i=1;i<=n;i++) {
		a1[i]=s1[i]-'0';
		a2[i]=s2[i]-'0';
	}
	sort(a1+1,a1+1+n);
	sort(a2+1,a2+1+n);
	int ans1=1,ans2=1;
	for(int i=1;i<=n;i++){
		if(a2[i]>=a1[ans1]) 
		ans1++;
	}
	for(int i=1;i<=n;i++){
		if(a2[i]>a1[ans2]) 
		ans2++;
	}
	cout<<n-ans1+1<<endl;
	cout<<ans2-1<<endl;
}

 

 

C. Alyona 및 스프레드 시트

질문의 의미하는 것은 : 당신은 2 차원 어레이를 제공하기 위해, Q는 각각의 주어진 L과 R, 증가 여부 유무의 적어도 하나 개의 원소의 행 R을 요청할 L 라인 문의 요구가있다.

해결책으로서, 제 1 전처리는 최대 거리의 각 행이 될 수 있으며, 광고의 출력의 다음 O (1) 시간. 코드 특정 전처리 봐.

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int c[maxn],d[maxn];
int main()
{
	int n,m;
	cin>>n>>m;
	int a[n+5][m+5]={0};
	for(int i=1;i<=n;i++) 
	   for(int j=1;j<=m;j++) 
	      cin>>a[i][j];
	int k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			k=i;
			if(d[j]>=i) k=d[j];//如果d[j]大于i,说明这个元素还在这个递增序列中。 
			else while(a[k+1][j]>=a[k][j]&&k<n) k++;//找到这个元素能到的最远距离 
			d[j]=k;//d[j]代表第j列能达到的最远距离 
			c[i]=max(k,c[i]);//c[i]代表第i行能到的最远距离 
		}
	}
	int q,l,r;
	cin>>q;
	while(q--){
		cin>>l>>r;
		puts(c[l]>=r?"Yes":"No");
	}
}

 

 

해시 태그의 D. 클라우드

질문의 의미 : 문자 최소 삭제 n 개의 문자열을 사전 순 있도록.

해결 방법 : 앞으로 업데이 트에서 그 대답은 내가 번째와 I + 1 문자열 문자열. S [I] [J]> S [I + 1] [J]를 다음 여기에서 직접 차단하는 경우. 만약 S [I] [J] <S [I + 1] [J], 전체 문자열을 저장할 것이다. 나는 렌 배열은 각 문자열의 법적 길이에 와서 정의합니다. 문자열의 사용을 권장하는 문자 때문에 충분히하지, 메모리 버스트 또는 오답으로 이어질 것입니다.

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+100;
string s[maxn];
int len[maxn];
int main()
{
	int n;
	cin>>n;
	int cur=0;
	for(int i=1;i<=n;i++) cin>>s[i],len[i]=s[i].size()-1;//保存每个字符串的长度 
	for(int i=n-1;i>=1;i--){
		int flag=1;
		for(int j=1;j<=min(len[i+1],len[i])&&flag;j++){
			if(s[i+1][j]>s[i][j]) flag=0;
			if(s[i+1][j]<s[i][j]) {
				len[i]=j-1;
				flag=0;
			}
		}
		if(flag) len[i]=min(len[i],len[i+1]);//如果flag=1,说明两个字符串前部分是相同的,截取相同的部分 
		if(len[i]==0) {//如果某个字符串已经是空串了,那前面的也就无法更新1了 
			cur=i;
			break;
		}
	}
	for(int i=cur;i>=1;i--) len[i]=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=len[i];j++) printf("%c",s[i][j]);
		puts("");
	}
}

 

 

E. 하노이 공장

문제의 의미 : N 디스크가 각 마스터는 외경 및 높이에 대응하는 내부 직경을 갖는다. 디스크는 디스크를 적층 할 수있는 방법을 상기 작은 외경 하에서 디스크의 외경 이하보다 큰 내경의 가장 요구 단으로 중첩 될 수있다.

해결책 : 욕심 제 동일한 디스크 ㄴ되도록, 최상층의 최소 내경이 디스크를 탈환 할 수 내림차순에 따라 동일의 B, 외경 B 내림차순으로 정렬 최대 직경 범위. 우리가 디스크를 꺼내 전에, 한 때까지 디스크의 요구 사항을 충족하기 위해 찾을 수 있도록 디스크가 다시 살아 온 뒤에 살아 다시, 그는 확실히 할 수 없다 온 수없는 경우, 디스크에 대한 시뮬레이션하기 위해 스택을 사용할 수 있습니다 .

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10; 
struct node{
	ll a,b,h;
	bool friend operator < (node c,node d){
		if(c.b==d.b) return c.a>d.a;
		return c.b>d.b;
	}
}e[maxn];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>e[i].a>>e[i].b>>e[i].h;
	sort(e+1,e+1+n);
	stack<node>s;
	ll ans=0,sum=0;
	for(int i=1;i<=n;i++){
		while(!s.empty()&&e[i].b<=s.top().a){
			sum-=s.top().h;
			s.pop();
		}
		sum+=e[i].h;//保存栈里圆盘的高度 
		ans=max(ans,sum);//更新答案 
		s.push(e[i]);
	}
	cout<<ans<<endl;
}

 

 

 

 

 

 

 

추천

출처blog.csdn.net/qq_42129242/article/details/90547506