A~E题解

A

签到题。2^n就是1<<n,正常比大小就可以了。
	int n;
    cin >> n;
    if ((1 << n) > n * n * n)cout << "B" << endl;
    else cout << "A" << endl;

B

 不重不漏枚举起点,长度一定所以终点一定,对于每个这样的字串判断是否符合条件。
#include<iostream>
using namespace std;
int main(){
    string s;
    cin>>s;
    int ans=0;
    for(int i=0; i<s.size(); ++i){
        if(i+4>=s.size())break;
        if(s[i]==s[i+2] && s[i+2]==s[i+4] && s[i]!=s[i+1] && s[i+1]==s[i+3])ans++;
    }
    cout<<ans<<endl;
    return 0;
}

C

根据题意,我们知道的基本事实是:

  1. 只要放置了一个路径上的障碍,那么两个人在此障碍到终点这一段地图会变成同一路径。所以不可能有两个障碍
  2. 一个“有效障碍”会让distance+2

1,2=>两个障碍的间距是二

进一步发现这两个人只能符合:

  1. (x,y),(x+1,y+1)
  2. (x,y)(x,y)

第一种情况要注意在第二行留一个空位放障碍。所以x+1,y+1这个点不能在n-1和n列。

#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    int x1, y1, x2, y2;
    cin>>x1>>y1>>x2>>y2;
    
    bool ans=false;
    ans=ans|(x1+y1==x2+y2);
    ans=ans|(x1-x2==1 && y1-y2==1 && y1!=n && y1!=n-1);
    ans=ans|(x1-x2==-1 && y1-y2==-1 && y2!=n && y2!=n-1);
    if(ans)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

D

假设处理后的数组是以第二个数字作为基底的,那么移开a[1]需要1个代价,那么肯定不如累加在a[2]上,那么此操作应该与a[2]加到a[1]上等价。

发现基本事实是把前k-1个最大的数直接堆在a[1]上。如果有许多这样相同的数,那么优先累加最靠近数组尾部的数。把这个命题反向思考易得。

搓了一个唐唐的代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+100;
struct node{
    int i;
    long long e;
    bool color=0;
}a[N];
bool cmp(node a, node b){
    return a.e>b.e || (a.e==b.e && a.i>b.i);
}
bool cmp2(node a, node b){
    return a.i<b.i;
}
void solve(){
    int n, k;
    cin>>n>>k;
    for(int i=1; i<=n; ++i){
        cin>>a[i].e;
        a[i].i=i;
        a[i].color=0;
    }
    sort(a+2, a+n+1, cmp);
    for(int i=2, u=1; u<=k; ++i, ++u){
        a[1].e+=a[i].e;
        a[i].color=1;
    }
    sort(a+2, a+n+1, cmp2);
    for(int i=1; i<=n; ++i){
        if(a[i].color==0)cout<<a[i].e<<' ';
    }
    cout<<endl;
    return;
}
int main(){
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}

E

使用mex分类。

mex=0的时候集合内数字必然全部相等,计数方式为sum:c(i,t), i∈[1,n],这个式子等价于2 的t次方-1

mex!=0的时候集合内的数字必然只能存在[0, mex-1]区间的数字。以每个数字可以产生的方案数为元素进行乘原理即可。

#include<iostream>
using namespace std;
const int mod=1e9+7;
const int N=1e6+1000;
long long net[N];
int a[N];
//cite:https://oiwiki.com/math/binary-exponentiation/
long long qmi(long long a, long long b, long long m) {
  a %= m;
  long long res = 1;
  while (b > 0) {
    if (b & 1) res = res * a % m;
    a = a * a % m;
    b >>= 1;
  }
  return res;
}
int cal(int x){
    return qmi(2, x, mod)-1;
}
int main(){
    int n;
    cin>>n;
    int maxn=0;
    for(int i=1; i<=n; ++i){
        cin>>a[i];
        net[a[i]]++;
        maxn=max(maxn, a[i]);
    }

    for(int i=0; i<=maxn; ++i)net[i]=cal(net[i]);
    long long ans=0;
    for(int i=1; i<=maxn; ++i){
        ans+=net[i];
        ans%=mod;
    }
        
    for(int i=1; i<=n; ++i){
        net[i]*=net[i-1];
        net[i]%=mod;
    }
    
    for(int i=0; i<=maxn; ++i){
        ans+=net[i];
        ans%=mod;
    }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务