はい。
Tinkoff Challenge - Elimination Round
A. Oleg and shares
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sl1(a) scanf("%lld",&a)
#define sl2(a,b) scanf("%lld %lld",&a,&b)
int main(){
long long n,k,m=1e9+7,ans=0;
sl2(n,k);
long long a[n];
rep(i,n) {
sl1(a[i]);
m=min(m,a[i]);
}
for (long long i=0;i<n;i++){
if ((a[i]-m)%k) {
printf("-1\n");
return 0;
} else {
ans+=(a[i]-m)/k;
}
}
printf("%lld\n",ans);
return 0;
}
長さnの数列aのそれぞれどれか1つずつをkだけ減少させてすべて同じ数にするのに何回かかるか。
B. Igor and his way to work
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define per(i,n) for(int i=n-1;i>=0;--i)
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c)
char s[1005][1005];
int main(){
int a,b,ans;
pair <int,int> ss,tt,ssyoko,sstate,ttyoko,tttate;
bool w[1005];
sc2(a,b);
rep(i,a) {
scanf("%s",s[i]);
rep(j,b) {
if (s[i][j]=='S') {ss.first=i; ss.second=j; }
else if (s[i][j]=='T') { tt.first=i; tt.second=j; }
}
}
for (int i=ss.second;i<b;i++) {
ssyoko.second=i;
if (s[ss.first][i]=='*') {ssyoko.second-=1; break;}
}
for (int i=ss.second;i>=0;i--) {
ssyoko.first=i;
if (s[ss.first][i]=='*') {ssyoko.first+=1; break;}
}
for (int i=tt.second;i<b;i++) {
ttyoko.second=i;
if (s[tt.first][i]=='*') {ttyoko.second-=1; break;}
}
for (int i=tt.second;i>=0;i--) {
ttyoko.first=i;
if (s[tt.first][i]=='*') {ttyoko.first+=1; break;}
}
for(int i=ss.first;i<a;i++) {
sstate.second=i;
if (s[i][ss.second]=='*') {sstate.second-=1; break;}
}
for(int i=ss.first;i>=0;i--) {
sstate.first=i;
if (s[i][ss.second]=='*') {sstate.first+=1; break;}
}
for(int i=tt.first;i<a;i++) {
tttate.second=i;
if (s[i][tt.second]=='*') {tttate.second-=1; break;}
}
for(int i=tt.first;i>=0;i--) {
tttate.first=i;
if (s[i][tt.second]=='*') {tttate.first+=1; break;}
}
bool f=0;
rep(i,1005) w[i]=1;
for (int i=min(ss.first,tt.first);i<=max(ss.first,tt.first);i++) {
for(int j=max(ssyoko.first,ttyoko.first);j<=min(ssyoko.second,ttyoko.second);j++) if (s[i][j]=='*') w[j]=0;
}
if(max(ssyoko.first,ttyoko.first)<=min(ssyoko.second,ttyoko.second)) {
for(int j=max(ssyoko.first,ttyoko.first);j<=min(ssyoko.second,ttyoko.second);j++) if (w[j]==1) f=1;
}
rep(i,1005) w[i]=1;
for (int i=max(sstate.first,tttate.first);i<=min(sstate.second,tttate.second);i++) {
for (int j=min(ss.second,tt.second);j<=max(ss.second,tt.second);j++) {
if (s[i][j]=='*') break;
if (j==max(ss.second,tt.second)) f=1;
}
}
if (f) cout<< "YES" << endl;
else cout << "NO" << endl;
return 0;
}
曲がる回数2回以内でSからTに辿り着けるか。曲がる回数2回以内。エやHのようなのをイメージしました。サンプル1はエのパターンです。
SとTの横に真っすぐ移動できる範囲の共通範囲で垂直に、直線で移動できる経路があるかどうか探す。エとHは向きが90度変わるのは書きやすい書き方で。