トピックリンク
A.シェルゲーム
質問の意味:ゲーム、それぞれ3つの右に位置し、左、引き換えに3枚のカード012、奇数交換が左と数字、そしてさらに数回の右の数字があります。ラウンド求めた後にn個のデジタルx番目の位置です。
ソリューション:アナログは、スクラッチ紙の上に再び直接サイクルごとに6を見つけます。(6 0標識、WA 2ヘア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番目のビットで、取得する最初の人フリックは、逆に二人目のフリックを得ます。今、あなたは、第二の配列の任意の並べ替えも、およびソート方法を尋ねたことができ、少なくともを得るためにフリック二人目を作ることができます。どのようなフリックは、利用可能な最初の人まで行うことができます。これらの2つの問題でソートすることは異なる場合があります。
ソリューション:貪欲タイトル。質問が第二のソート順序のためにのみ求めたが、実際にもソートすることができますが最初のシーケンスのために(、第二の配列はソートする同等の最初のシーケンスの一種である、それについて考える)を。だから、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の増加かどうか存在する少なくとも1つの素子行Rを依頼する各所定のLとR、Lラインを尋ねる、依頼があります。
溶液:最初の前処理は、ライン上の出力のその後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 TH及びI + 1列の文字列のため。S [i]は[J]> S [I + 1] [j]は、その後、ここから直接切断した場合。もしS [i]は[J] <S [I + 1] [j]は、文字列全体を保存することになります。私はlenの配列は各文字列の長さは法的に入って来る定義します。文字列の使用をお勧めします、charがない十分な長さや間違った答えにつながるので、メモリをバーストします。
#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の外径bを降順にソート最大直径範囲。私たちは、ディスクを取り出して前に1がディスクの要件を満たすために発見されるまで、あなたは、再び生きて来た後、彼は確かにディスクの後ろにすることはできません、あなたは再び生きて来たことができない場合は、ディスクのために、シミュレートするために、スタックを使用し、そうすることができます。
#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;
}