주제 링크
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;
}