A.签到题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x,y,z;
cin>>x>>y>>z;
if(x>y+z){
printf("+\n");
}else if(y>x+z){
printf("-\n");
}else if(x==y&&z==0){
printf("0\n");
}else printf("?\n");
return 0;
}
B.只要计算出每个点到(1,1)的距离存下来。然后最后一个点和(1,1)符合则所有都符合。
求出行数,再构造就行。
#include <bits/stdc++.h>
using namespace std;
int a[1001][1001];
int main()
{
for(int i=1;i<=1000;i++)
for(int j=1;j<=1000;j++)
a[i][j] = i+j-2;
int n,tn;
cin>>n; tn = n - 1;
if(tn%2==1)tn++;
tn=(tn+2)/2;//tn行
printf("%d\n",tn);
int cnt = 1;
for(int i=1;i<=tn;i++)
for(int j=1;j<=tn;j++){
if(a[i][j]>=cnt-1){
printf("%d %d\n",i,j);
cnt++;
if(cnt==n+1)break;
}
if(cnt==n+1)break;
}
return 0;
}
C.
序列有两种情况求解:
1.序列从1到最后有序,只要把手中牌插入就行;
2.否则要全部拿出到手中,再按顺序插入,不过全部拿到手中不是说要同时拿到手中
比如
11
0 0 0 5 0 0 0 4 0 0 11
9 2 6 0 8 1 7 0 3 0 10
是将前七个拿出,再放1,2,放2时3就被拿出来了。 这个过程就是找 插入0的最小个数再加上n。
#include <bits/stdc++.h>
using namespace std;
struct No{
int va,id;
}pipl[200005];
int hand[200005],xu[200005];
int n,tp,ans = 0,an;
bool judge2(){
int tx = pipl[1].id,tf=1;
an = tx - 1;
int hand2[200005];
for(int i=1;i<=n;i++)hand2[i] = hand[i];
for(int i=tx+1;i<=n;i++){
if(xu[i]!=xu[i-1]+1)return false;
}
tf = xu[n]+1;
int id=1;
while(tf<=n){
if(hand2[tf]==1){
tf++; if(id<tx)hand2[xu[id]]=1; id++;
}else return false;
}
return true;
}
int main()
{
cin.tie(0);
cin>>n;
for(int i=0;i<n;i++){
cin>>tp; hand[tp] = 1;
}
for(int i=1;i<=n;i++){
cin>>xu[i]; pipl[xu[i]].id = i; pipl[xu[i]].va = xu[i];
}
if(judge2()){//判断是否可以直接插入
printf("%d\n",an);
return 0;
}
for(int i=1;i<=n;i++)
if(hand[i]!=1){//不可直接插入则算出 最小最多无效用次数,即放0的个数
ans = max(ans,pipl[i].id - (i-1));
}
printf("%d\n",n+ans);
return 0;
}
/*
3
0 2 0
3 0 1
*/
D.