喵哈哈村的魔法考试 Round #12 (Div.2) 题解
A
注意答案会超过int,考虑分l,r奇数和偶数来考虑即可。
#include<bits/stdc++.h>
using namespace std;
long long l,r;
int main(){
while(cin>>l>>r){
if(l%2==1){
l++;
}
if(r%2==1){
r--;
}
if(l>r){
cout<<"0"<<endl;
continue;
}
cout<<(r-l+2)/2<<endl;
}
}
B
如果这个马存活下来,说明前面没有比他跑得快的。
按着坐标排序,记录前缀最大值就好了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
pair<int,int> P[maxn];
int n;
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
scanf("%d%d",&P[i].first,&P[i].second);
}
int Mx = -1;
int Ans = 0;
sort(P+1,P+1+n);
for(int i=1;i<=n;i++){
if(Mx>P[i].second){
continue;
}
Mx = max(P[i].second,Mx);
Ans++;
}
cout<<Ans<<endl;
}
}
C
dp1[i]表示以i结尾的最长上升序列,dp2[i]表示以i开头的最长下降序列。
然后check一下就好了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+7;
int d1[maxn],d2[maxn],a[maxn],n;
int main(){
while(scanf("%d",&n)!=EOF){
a[0]=1e9;
a[n+1]=1e9;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(a[i]>a[i-1])d1[i]=d1[i-1]+1;
else d1[i]=0;
}
for(int i=n;i>=1;i--){
if(a[i]>a[i+1])d2[i]=d2[i+1]+1;
else d2[i]=0;
}
int Len = 0;
int ansl=-1,ansr=-1;
for(int i=1;i<=n;i++){
if(d1[i]>0&&d2[i]>0){
if(Len<d1[i]+d2[i]){
ansl=i-d1[i]-1;
ansr=i+d2[i]-1;
Len=d1[i]+d2[i];
}else if(Len==d1[i]+d2[i]){
if(ansl>i-d1[i]-1){
ansl=i-d1[i]-1;
ansr=i+d2[i]-1;
}
}
}
}
cout<<ansl<<" "<<ansr<<endl;
}
}
D
模拟题,做起来比较烦。
理清思路去写就好了,其实只要把这个数据[[][]]过了,基本上就过了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
string s;
int d[maxn];
int main(){
while(cin>>s){
memset(d,0,sizeof(d));
for(int i=0;i<s.size();i++){
if(s[i]=='[')d[i]++;
else d[i]--;
}
int Mx = 1;
for(int i=1;i<s.size();i++){
d[i]+=d[i-1];
Mx=max(Mx,d[i]);
}
int len=2*Mx-1,len2=0;
int flag = 0;
for(int i=0;i<s.size();i++){
if(s[i]=='['){
int Flag = 0;
if(flag==0){
Flag = 1;
flag = 1;
}else if(flag==1){
len-=2;
len2++;
}
if(len2){
for(int j=0;j<len2-1;j++){
printf(" ");
}
if(Flag==0)
printf("|");
else
printf(" ");
}
printf("+");
for(int j=0;j<len;j++)
printf("-");
printf("+");
if(len2){
if(Flag==0)
printf("|");
}
printf("\n");
}else{
int Flag = 0;
if(i+1<s.size()&&s[i+1]=='['){
Flag = 1;
}
if(flag==1){
flag = 0;
len2++;
if(len2){
for(int j=0;j<len2-1;j++){
printf(" ");
}
printf("|");
}
for(int j=0;j<len;j++)
printf(" ");
printf("|");
printf("\n");
printf("\n");
if(len2){
for(int j=0;j<len2-1;j++){
printf(" ");
}
printf("|");
}
for(int j=0;j<len;j++)
printf(" ");
printf("|");
printf("\n");
len2--;
}else{
len+=2;
len2--;
}
if(len2){
for(int j=0;j<len2-1;j++){
printf(" ");
}
if(Flag==0)
printf("|");
else
printf(" ");
}
printf("+");
for(int j=0;j<len;j++)
printf("-");
printf("+");
if(len2){
if(Flag==0)
printf("|");
}
printf("\n");
}
}
}
return 0;
}
E
简单博弈论。
相当于在nn的矩阵里铺21的地砖.
所以胜利的结果显然跟n的奇偶有关.
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
while(cin>>n){
if(n%2==0){
cout<<"XiaoMing"<<endl;
}else{
cout<<"XiaoHong"<<endl;
}
}
}