牛客周赛round 43 A~E

A(简单博弈)

如果字符串长度大于1先手必赢。

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using i64 = long long;
using i128 = __int128_t;
const ll inf = 1e18;
void solve()
{
    string s;
    cin>>s;  
    if(s.length()==1)
    cout<<"yukari"<<"\n";
        else
    cout<<"kou"<<"\n";
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll t = 1;
    //cin >> t;
    while (t--)
        solve();
    return 0;
}

B(模拟)

解释#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using i64 = long long;
using i128 = __int128_t;
const ll inf = 1e18;
void solve()
{
    string s;
    cin>>s;  
    if(s.length()==1)
    cout<<"yukari"<<"\n";
        else
    cout<<"kou"<<"\n";
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll t = 1;
    //cin >> t;
    while (t--)
        solve();
    return 0;
}

C(数学)

俩个素数乘积必为和数,要让极差最小,毫无疑问,就是让所有的数更加平均,只要用最大*最小,次大*次小...

注意n为奇数的时候留最后一位

解释#include<bits/stdc++.h>
#define int long long 
#define y second 
using namespace std;
typedef long long LL;
typedef double D;
const int N = 2e5 + 10;
typedef pair<int, int> Pii;
vector<int>s;
void solved()
{
    int n;
    cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    sort(a.begin(),a.end());
    int l=0,r=n-1;
    if(n%2==1)r--,s.push_back(a[n-1]);
    while(l<r){
      s.push_back(a[l]*a[r]);
      l++,r--;
    }
    sort(s.begin(),s.end());
    cout<<s[s.size()-1]-s[0]<<"\n";
}
signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  t=1;
  while (t--)
  {
  solved();
  }
  return 0;
}

D(树)

如果n为奇数,肯定是-1

解释#include<bits/stdc++.h>
#define x first   
#define y second 
using namespace std;
typedef long long LL;
typedef double D;
const int N = 2e5 + 10;
typedef pair<int, int> Pii;
vector<int>e[N];
int ans=0;

int  dfs(int u,int fa){
    int res=1;
    for(auto son :e[u]){
        if(son==fa)continue;
        int k=dfs(son,u);
        if(k%2==0)ans+=1;
        else res+=k;
    }
    return res;
}
void solved()
{
     int n;cin>>n;
     for(int i=1;i<n;i++){
        int a,b;
        cin>>a>>b;
        e[a].push_back(b);
        e[b].push_back(a);
     }  
     if(n&1)cout<<-1; 
     else{
        dfs(1,0);
        if(ans==0){
           cout<<-1;
        }
        else cout<<ans<<"\n";
    }
    
}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t=1;
  while (t--)
  {
  solved();
  }
  return 0;
}

E(组合数

对于第i位数字,它可以充当k位里面的第j位,如果判断其充当第k位的次数,其贡献就为s[i]*后面n-i个数里面先择k-j位,组合数学

解释#include<bits/stdc++.h>
#define int long long 
#define y second 
using namespace std;
typedef long long LL;
typedef double D;
const int N = 2e3 + 10;
typedef pair<int, int> Pii;
int c[N][N];
int mod=1e9+7;
int pre[N];
void init(){
    for(int i=0;i<=2000;i++){
        for(int j=0;j<=i;j++){
            if(j==0)c[i][j]=1;
            else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
        }
    }
}
int qmi(int  x,int  p){
    int  res=1;
    while(p){
        if(p&1)res=res*x%mod;
        x=x*x%mod;
        p>>=1;
    }
    return res;
}
void solved()
{
      int n,k;cin>>n>>k;
      string s;
      cin>>s;
      int ans=0;
    
      for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
          int x=n-i;
          int y=s[i-1]-'0'; 
          
          if(j==1){
            if(k-j>x)continue;
            ans+=c[x][k-j]*qmi(10,k-j)%mod*y%mod;
            ans%=mod;
            }
          else {
            x=i-1;
            int tp=j-1;
            if(n-i<k-j)continue;
            if(x<tp)continue;
            ans+=(c[x][tp]*c[n-i][k-j]%mod)*qmi(10,k-j)%mod*y%mod;
            ans%=mod;
          }
        }
      }
      cout<<ans<<"\n";
      
}
signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  t=1;
  init();
  while (t--)
  {
  solved();
  }
  return 0;
}
全部评论
d题 偶数一定有解 因为树一定连同 可以删0条边 答案就是0
1
送花
回复
分享
发布于 05-12 22:24 江西

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务