C - Takahashi Gets Lost
分析:数据小,暴力没什么好说的
int h,w,n;
string t;
char c[505][505];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int get(char c){
if(c=='L')return 3;
if(c=='U')return 1;
if(c=='R')return 2;
return 0;
}
int check(int x,int y,int id){
if(c[x][y]!='.')return 0;
if(id==n)return 1;
int opt=get(t[id]);
int nx=x+dx[opt];
int ny=y+dy[opt];
if(c[nx][ny]!='.')return 0;
return check(nx,ny,id+1);
}
signed main(){
cin>>h>>w>>n;
cin>>t;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>c[i][j];
}
}
int ans=0;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
ans+=check(i,j,0);
}
}
cout<<ans;
return 0;
}
D - Only one of two
知识点:最小公倍数,二分,容斥原理
分析:符合要求的数字不能同时是n和m的倍数。所以我们求出n和m的最小公倍数lc,但凡是lc的倍数,就不符合要求。
然后二分查找第k个数的值。
设x为答案
那么
ps:一个容易忽略的点,0是任何数的倍数
int n, m, k,lc;
int a[N];
bool check(int x) {
if (x / n + x / m - (x / lc)*2 >= k) return 1;
else return 0;
}
void solve() {
//能被n或m其中一个整除
cin >> n >> m >> k;
lc = lcm(n, m);
int l = 1, r = 1e19;
int ans = 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
r = mid - 1;
ans = mid;
}
else {
l = mid + 1;
}
}
cout << ans << endl;
}