https://codeforces.com/contest/1547/problem/A
A.Shortest Path with ObstacleCodeforces
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=b;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
int main()
{
ios::sync_with_stdio(0);
int a,b,c,d,e,f,t;
cin>>t;
while(t--)
{
cin>>a>>b>>c>>d>>e>>f;
// a b
// c d
// e f
if(a==c)
{
if(e==a)
{
if((f>max(b,d))||(f<min(b,d)))cout<<fabs(b-d)<<endl;
else cout<<fabs(b-d)+2<<endl;
}
else cout<<fabs(a-c)+fabs(b-d)<<endl;
}
else if(b==d)
{
if(f==b)
{
if(e>max(a,c)||e<min(a,c))cout<<fabs(a-c)<<endl;
else cout<<fabs(a-c)+2<<endl;
}
else cout<<fabs(a-c)+fabs(b-d)<<endl;
}
else cout<<fabs(a-c)+fabs(b-d)<<endl;
}
return 0;
}
https://codeforces.com/contest/1547/problem/B
B.Alphabetical Strings
找到最小的位置,一个变量temp标记这个坐标。
如果最小不是a直接输出NO
这个合理的字符串必须是从a开始到a+strlen(s)结束才合理
核心:
for(int i=1;i<len&&pd==1;i++)
{
if(s[l-1]=='a'+i)l--;
else if(s[r+1]=='a'+i)r++;
else pd=0;
if(pd==0)break;
}
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
char s[30];
int main()
{
ios::sync_with_stdio(0);
cin>>t;
while(t--)
{
cin>>s+1;
int len=strlen(s+1);
int l=0,r=0,pd=1;
for(int i=1;i<=len;i++)
{
if(s[i]=='a')
{
l=i;r=i;break;
}
}
if(len==1)
{
if(s[1]=='a')
{
printf("YES\n");
}
else printf("NO\n");
continue;
}
if(l==0)
{
printf("NO\n");continue;
}
else
{
for(int i=1;i<len&&pd==1;i++)
{
if(s[l-1]=='a'+i)l--;
else if(s[r+1]=='a'+i)r++;
else pd=0;
if(pd==0)break;
}
}
if(pd==1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
https://codeforces.com/contest/1547/problem/C
C. Pair Programming
这是一道普通模拟题,如果是A,B两个任务,输入目前代码行数k
当A或者B是0的时候k要+1。
一个循环,A能执行继续往下走,否则看B,如果还不能走就说明是完不成的。
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
int k,t,n,m,a[105],b[105],A,B,f[305];
int main()
{
ios::sync_with_stdio(0);
cin>>t;
while(t--)
{
cin>>k>>n>>m;
rep(i,1,n)cin>>a[i];
rep(i,1,m)cin>>b[i];
A=1;B=1;
int pd=1,weizhi=0;
for(int i=1;i<=n+m&&pd==1;i++)
{
if(a[A]<=k&&A<=n)
{
weizhi++;
if(a[A]==0)k++;
f[weizhi]=a[A];
A++;
}
else if(b[B]<=k&&B<=m)
{
weizhi++;
if(b[B]==0)k++;
f[weizhi]=b[B];
B++;
}
else pd=0;
}
if(pd==1)
{
rep(i,1,n+m)cout<<f[i]<<" ";
cout<<endl;
}
else cout<<"-1"<<endl;
}
return 0;
}
https://codeforces.com/contest/1547/problem/E
E. Air Conditioners
这是一道简单的模拟题,空调可能能决定自己或者其他房间的温度。我们可以从左边扫到右边再从右边扫到左边,分别取这两个数组的最小值就本题的思路。
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
using namespace std;
inline int read()
{
ll s=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
return s*f;
}
int t,n,k,z[300005],y[300005],a[300005],yi[300005];
int main()
{
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
cin>>t;
while(t--)
{
cin>>k>>n;
for(int i=0;i<=k+1;i++)z[i]=hh,y[i]=hh,a[i]=hh;
for(int i=1;i<=n;i++)cin>>yi[i];
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[yi[i]]=x;
}
for(int i=1;i<=k;i++)
{
y[i]=min(y[i-1]+1,a[i]);
}
for(int i=k;i>=1;i--)
{
z[i]=min(z[i+1]+1,a[i]);
}
for(int i=1;i<=k;i++)
{
cout<<min(y[i],z[i])<<" ";
}
cout<<endl;
}
return 0;
}