Codeforces Round 925 (Div. 3)(A-F)

A:Recovering a Small String

给你一个数让你用三个字母表示并且最小我们想一下

如果小于28就输出aa加字母,小于53就输出 a+字母+z否则就上字母+zz

暴力枚举也可以找到直接退出循环

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int,int>pii;
#define N 200010
int a[N];
void solve(){
   int n;
   cin>>n;
   if(n<=28) cout<<"aa"<<char('a'-1+n-2)<<endl;
   else if(n<=53)cout<<"a"<<char(n-27+'a'-1)<<"z"<<endl;
   else cout<<char(n-52+'a'-1)<<"zz"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

B:Make Equal

i<j就可以用多的给少的可以先算出平均值然后每个数减去这个值,记录其他数字,如果出现当前累计的数值加上当前数值小于零就停下,不满足全部相等

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int,int>pii;
#define N 200010
int a[N];
void solve(){
   int n;
   cin>>n;
   int s=0;
   for(int i=0;i<n;i++) cin>>a[i],s+=a[i];
   s=s/n;
   for(int i=0;i<n;i++) a[i]-=s;
   int sum=0;
   bool flag=false;
   for(int i=0;i<n;i++){
   	   sum+=a[i];
   	   if(sum<0) flag=true;
   }
   if(flag) cout<<"NO"<<endl;
   else cout<<"YES"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

C:Make Equal Again

让你找出区间最小使全部相等

我们可以使用双指针,左边有相等右移,反之左移,求出最大值

如果左右相等则算区间内的值不相等的话就去小的区间

重点是如何记录,可以用map

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int,int>pii;
#define N 200010
int a[N];
void solve(){
   int n;
   cin>>n;
   for(int i=0;i<n;i++) cin>>a[i];
   int l=0,r=n-1;
   int res=0x3f3f3f3f;
   while(l+1<n&&a[l]==a[l+1]) l++;
   res=min(res,n-l-1);
   while(r-1>=0&&a[r]==a[r-1]) r--;
   res=min(res,r);
   if(a[l]==a[r]&&l!=n-1) res=min(res,r-l-1);
   cout<<res<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

D:Divisible Pairs

i<j&&(a[i]+a[j])%x==0 &&(a[i]-a[j])%y==0

我们必须要准备记录a[i]%x的值和a[i]%y的值,边记录边计算

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int,int>pii;
#define N 200010
int a[N];
void solve(){
   int n,x,y;
   cin>>n>>x>>y;
   for(int i=0;i<n;i++) cin>>a[i];
   map<pii,int>m;
   int res=0;
   for(int i=0;i<n;i++){
   	   res+=m[{(x-(a[i]%x))%x,a[i]%y}];
   	   m[{(a[i]%x),a[i]%y}]++;
   }
   cout<<res<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

E:Anna and the Valentine's Day Gift

贪心   选择一个数,一个是翻转,一个是连接

如果末尾是0,则删除对第一个人有利,但把0连接也对第二个人也有利

我们记录0数量排序进行增减,记录总位数进行比较 ,10的m次方是m+1位(注意)

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int,int>pii;
#define N 200010
int a[N],b[N];
void solve(){
    int n,m;
    cin>>n>>m;
    int cnt=0;
    for(int i=0;i<n;i++) {
    	cin>>a[i];
    	while(a[i]%10==0) a[i]/=10,cnt++,b[i]++;
    	while(a[i]) a[i]/=10,cnt++;
	}
	sort(b,b+n);
	reverse(b,b+n);
	for(int i=0;i<n;i+=2) cnt-=b[i];
	for(int i=0;i<n;i++) b[i]=0;
    if(cnt>=m+1) cout<<"Sasha"<<endl;
    else cout<<"Anna"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

F:Chat Screenshots

告诉你顺序,我们发现忽视第一个人,后面的顺序如果不是拓扑序列就不满足条件,我们只要存下边,进行判断拓扑序列即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
typedef pair<int,int>pii;
#define N 200010
int a[N],b[N];
vector<int>g[N];
int in[N];
void solve(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)g[i].clear(),in[i]=0;
    while(m--){
    	for(int i=1;i<=n;i++) {
    		cin>>a[i];
    		if(i>=3) g[a[i-1]].push_back(a[i]),in[a[i]]++;
		}
	}
	queue<int>q;
	 for (int i = 1; i <= n; i ++ )  if(!in[i]) q.push(i);
    vector<int>s;
    while(!q.empty()){
    	int t=q.front();
    	q.pop();
    	s.push_back(t);
    	for(auto x:g[t]){
    		if(--in[x]==0) q.push(x);
		}
	}
    if(s.size()==n) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

F:One-Dimensional Puzzle

我们发现12可以交替并且12之间可以加入34

使用隔板法

如果12相差大于1就不能交替插入

相等的话对称计算

如果12是0,34必须只能有一个否则为0

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int,int>pii;
#define N 2000010
int a[N],b[N];
int mod=998244353;
int fact[N],infact[N],inv[N];
int cal(int n, int m ) {
    if(n < m)return 0;
    return fact[n]*infact[n-m]%mod*infact[m]%mod;
}
void init(){
	infact[0] = infact[1] = 1;
    fact[0] = fact[1] = 1;
    inv[1] = 1;
    for( int i = 2; i <=N; i ++ ) {
        fact[i] = fact[i-1] * i % mod;
        inv[i] = (mod - mod/i)*inv[mod%i]%mod;
        infact[i] = infact[i-1] * inv[i] % mod;
    }
}
void solve(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    if(abs(a-b)>=2) {
    	cout<<"0"<<endl;
        return ;
	}
	int ans=0;
	if(a==0&&b==0) {
		if(c==0||d==0)ans=1;
	}
	else if(a>b){
		ans+=cal(c+a-1,a-1)*cal(d+a-1,a-1)%mod;
	}
	else if(a<b){
		ans+=cal(c+b-1,b-1)*cal(d+b-1,b-1)%mod;
	}
	else {
		    ans+=cal(c+a,a)%mod*cal(d+b-1,b-1)%mod;
            ans+=cal(c+a-1,a-1)%mod*cal(d+b,b)%mod;
	}
	cout<<ans%mod<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    init();
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多年以后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值