C–Draw Grids
题意:
总共有
n
∗
m
n*m
n∗m 个点, 两人轮流选取两个点连一条线, 不能连已经连过的线, 并且连成的图形不能形成闭合回路, 两人都选取最优策略,最后不能操作的人输
题解:
判断奇偶性就好
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int ans=n*m-1;
if(ans%2) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
D–Er Ba Game
题意:
给定四个数
a
1
a1
a1,
b
1
b1
b1,
a
2
a2
a2,
b
2
b2
b2 按照以下规定比较
输出谁赢
题解:
简单的模拟, 按照规则模拟就好了
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
if(a>b) swap(a,b);
if(c>d) swap(d,c);
if(a==2&&b==8)
{
if(c==2&&d==8) cout<<"tie"<<endl;
else cout<<"first"<<endl;
}
else if(c==2&&d==8)
{
if(a==2&&b==8) cout<<"tie"<<endl;
else cout<<"second"<<endl;
}
else if(a==b&&c!=d) cout<<"first"<<endl;
else if(c==d&&a!=b) cout<<"second"<<endl;
else if(a==b&&c==d)
{
if(a>c) cout<<"first"<<endl;
else if(a<c) cout<<"second"<<endl;
else cout<<"tie"<<endl;
}
else if((a+b)%10>(c+d)%10) cout<<"first"<<endl;
else if((a+b)%10<(c+d)%10) cout<<"second"<<endl;
else if((a+b)%10==(c+d)%10)
{
if(b>d) cout<<"first"<<endl;
else if(d>b) cout<<"second"<<endl;
else cout<<"tie"<<endl;
}
}
return 0;
}
K–Stack
题意:
题中代码为求单调递增序列, 并用 b b b 数组储存当前栈里有几个数字 (当前有几个数字递增) , 给定 k k k 个 b b b 数组的信息, 求原序列( n n n 排列)
题解:
我们可以先把 b b b 数组填完
例如
对于没填过的地方, 我们可以按照递增处理
如果发现
b
[
j
]
−
b
[
i
]
>
j
−
i
b[j]-b[i] > j - i
b[j]−b[i]>j−i, 说明递增的数字增加幅度大于最大能增加的数字, 则说明不满足,输出
−
1
-1
−1
填完
b
b
b 数组以后, 我们按照
b
b
b 数组来填写
a
a
a数组(原序列), 因为对于每一个
b
[
i
]
b[i]
b[i], 可以确定
i
i
i 以前的排列状态, 所以需要从后面开始确定
a
a
a 数组
每次模拟都找到队头元素
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],b[N];
stack<int> q;
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++)
{
int x,y;
cin>>x>>y;
b[x]=y;
}
for(int i=1;i<=n;i++)
{
if(!b[i]) b[i]=b[i-1]+1;
if(b[i]-b[i-1]>1)
{
cout<<-1<<endl;
return 0;
}
}
int con=0;
for(int i=n;i>=1;i--)
{
while(b[i]>q.size()) q.push(++con);
a[i]=q.top();
q.pop();
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}