比赛链接:ABC341
Problem A:
先签个到。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
for(int i=0;i<n;i++)
cout<<"10"<<endl;
cout<<"1"<<endl;
return 0;
}
Problem B:
继续签。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int a[maxn],s[maxn],t[maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++)
cin>>s[i]>>t[i];
for(int i=1;i<=n-1;i++)
a[i+1]+=a[i]/s[i]*t[i];
cout<<a[n]<<endl;
return 0;
}
Problem C:
水题,直接模拟就行了。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
char grid[505][505];
bool valid(int x,int y){
if(x>=1 && y>=1 && x<=n && y<=m && grid[x][y]!='#')
return true;
else
return false;
}
int main(){
cin>>n>>m>>k;
string op;
cin>>op;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cin>>grid[i][j];
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(grid[i][j]=='#')
continue;
int x=i,y=j;
bool ok=true;
for(int l=0;l<k;l++){
if(op[l]=='L')
y--;
else if(op[l]=='R')
y++;
else if(op[l]=='U')
x--;
else
x++;
if(valid(x,y)){//看清条件
ok=false;
break;
}
}
if(ok)
ans++;
}
}
cout<<ans<<endl;
return 0;
}
Problem D:
有意思的数学题。
我们知道,从1到lcm(n,m)中,只有个可以被n整除,同理,有个可以被m整除。
而从1到lcm(n,m)中,只有lcm(n,m)可以同时被n和m整除。
再换句话说,从1到lcm(n,m)中有个只能被n整除,同理,有可以被m整除,所以,从1到lcm(n,m)中,有个符合条件的数。所以,在每个长度为lcm(n,m)的区间内,都有那么多个满足条件的数(实在懒得打LaTeX了)。
综上,答案就是在第个区间第k mod a小的数。
#include <bits/stdc++.h>
using namespace std;
long long lcm(long long x,long long y){
return x*y/__gcd(x,y);
}
long long g(long long x,long long y){
return lcm(x,y)/x+lcm(x,y)/y-2;
}
int main(){
long long n,m,k;
cin>>n>>m>>k;
long long ans=k/g(n,m)*lcm(n,m);
k%=g(n,m);
if(k==0){
cout<<ans-min(n,m)<<endl;
return 0;
}
long long p=1,q=1;
while(--k){//为什么这里写成k--不行啊
if(n*p<m*q)
p++;
else
q++;
}
cout<<ans+min(n*p,m*q)<<endl;
return 0;
}
顺便说一句,为什么19行不能写成k--啊,本蒟蒻调了半天,有知道的大佬可以在评论区告诉我,我将感激不尽。
E是线段树,就先咕了。
ok,以上就是本期的全部内容了。我们下期再见!
友情提示:本期的代码都有问题(除了D的代码),请不要无脑Ctrl C+Ctrl V