AtCoder Beginner Contest 405 A - E
A - Is it rated?
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;
void solve(){
int a,b;
cin>>a>>b;
if(b==1){
if(a>=1600 && a<=2999){
cout<<"Yes";
}else{
cout<<"No";
}
}else{
if(a>=1200 && a<=2399){
cout<<"Yes";
}else{
cout<<"No";
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
B - Not All
记录下每个数出现的个数,从后往前删数,删一个数就给这个数的个数--,直到一个在1 - m中的数出现个数被减到0
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;
void solve(){
int n,m;
cin>>n>>m;
vector<int> a(n+1);
map<int,int>mp;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;
}
int cnt=0;
for(int i=1;i<=m;i++){
if(mp[i]) cnt++;
}
if(cnt<m){
cout<<0;
return;
}
for(int i=n;i>=1;i--){
if(a[i]>=1 && a[i]<=m){
if(mp[a[i]]>0){
mp[a[i]]--;
if(mp[a[i]]==0){
cout<<n-i+1;
return;
}
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
C - Sum of Product
前缀和即可
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;
void solve(){
int n,ans=0;
cin>>n;
vector<int> a(n+1),pre(n+10);
for(int i=1;i<=n;i++){
cin>>a[i];
pre[i]=a[i]+pre[i-1];
}
for(int i=2;i<=n;i++){
ans+=a[i]*pre[i-1];
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
D - Escape Route
多源BFS,初始时把所有E放进队列里,做BFS。过程中维护每一步走的方向。
注意这里是从终点开始走,所以每一步的方向是从重点到起点,输出时需要反过来。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;
void solve(){
int n,m;
cin>>n>>m;
char g[n+10][m+10];
int dir[n+10][m+10];
queue<pii> q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dir[i][j]=-1;
cin>>g[i][j];
if(g[i][j]=='E'){
q.push({i,j});
dir[i][j]=5;
}
if(g[i][j]=='#'){
dir[i][j]=4;
}
// if(i==1 && j==20) cout<<dir[i][j]<<endl;
}
}
int dx[]={1,0,-1,0};
int dy[]={0,-1,0,1};//下,左,上,右
while(q.size()){
auto [a,b]=q.front();
q.pop();
// if(a==1 && b==16) cout<<"--"<<endl;
for(int i=0;i<4;i++){
int x=a+dx[i];
int y=b+dy[i];
// if(x==1 && y==16) cout<<"--"<<endl;
if(x<1 || x>n || y<1 || y>m) continue;
if(g[x][y]=='#' || g[x][y]=='E') continue;
if(dir[x][y]!=-1) continue;
dir[x][y]=i;
q.push({x,y});
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int val=dir[i][j];
if(val==5){
cout<<'E';
}
else if(val==4){
cout<<'#';
}
else if(val==0){
cout<<'^';
}
else if(val==1){
cout<<'>';
}
else if(val==2){
cout<<'v';
}
else if(val==3){
cout<<'<';
}
}
cout<<endl;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
E - Fruit Lineup
最组合数学的一集
首先要确定ABCD之间的关系:

在C之前要放完所有A,在D之前要放完所有A和B
先不考虑BD,只考虑AC,显然只有一种情况,就是 AAACCCC这样,在考虑如何把BD插进去。
首先对B来说,肯定是随便放, 可以放到任意两个数之间或者整个数组两边,共cnt = A+C+1 个空位
对于D, 当确定最后一个B的位置之后, 这个位置之后的所有空位, 都可以放D。 但最后一个B在最后一个A之前时, 则D可以放的位置变成最后一个A之后的空位数。
所以我们要枚举B的最后一个位置, 而最后一个B的位置共有cnt个可能,此时剩下B - 1个B。
如何计算?对于每个空位,这里用到组合数学的插板法,但是每个空位可以放0个或多个。
https://oi-wiki.org/math/combinatorics/combination/
代码实现很标准,可以看代码写法
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf = 1e18;
const int mod = 998244353;
const int N=3e6+10;
int fact[N];
int infact[N];
int qmi(int a,int b,int p){
int res=1;
while(b){
if(b&1) res=res*a%p;
b>>=1;
a=a*a%p;
}
return res;
}
void init(){
fact[1]=1;
fact[0]=1;
infact[0]=1;
for(int i=2;i<N-1;i++){
fact[i]=fact[i-1]*i%mod;
}
infact[N-2]=qmi(fact[N-2],mod-2,mod);
for(int i=N-2;i>1;i--){
infact[i-1]=infact[i]*i%mod;
}
}
void solve(){
init();
int a,b,c,d;
cin>>a>>b>>c>>d;
int cnt=a+c+1;//共有cnt个位置
int ans=0;
auto C=[&](int a,int b)-> int{
if(b>a){
return 0;
}
return fact[a]*infact[b]%mod*infact[a-b]%mod;
};
for(int i=cnt;i>=1;i--){
ans += C(b-1+i-1, b-1) * C(d+min(c+1, cnt-i+1)-1, d) % mod;
ans%=mod;
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}

浙公网安备 33010602011771号