给你一个数让你用三个字母表示并且最小我们想一下
如果小于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();
}
}
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();
}
}
让你找出区间最小使全部相等
我们可以使用双指针,左边有相等右移,反之左移,求出最大值
如果左右相等则算区间内的值不相等的话就去小的区间
重点是如何记录,可以用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();
}
}
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();
}
}
告诉你顺序,我们发现忽视第一个人,后面的顺序如果不是拓扑序列就不满足条件,我们只要存下边,进行判断拓扑序列即可
#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();
}
}
我们发现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();
}
}