2020牛客寒假集训营1

B.kotori和bangdream

https://ac.nowcoder.com/acm/contest/3002/B

大水题

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
double n,a,x,b;
double ans1,ans2;
int main() {
  ios::sync_with_stdio(false);
  cin>>n>>x>>a>>b;
  ans1=n*a;
  ans2=n*b;
  double ans=ans1*x/100+ans2*(100-x)/100;
  printf("%.2lf",ans);
    return 0;
}

D.hanayo和米饭

https://ac.nowcoder.com/acm/contest/3002/D

签到题

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#define ll long long
using namespace std;
const int N=1e6+10;
int n;
int a[N];
int t;
 
int main(){
  cin>>n;
  memset(a,0,n);
 for(int i=1;i<=n-1;i++){
    cin>>t;
    a[t]=t;
 }
 for(int i=1;i<=n;i++){
    if(i!=a[i]){
        cout<<i<<endl;
        return 0;
    }
 }
return 0;
}

A.honoka和格点三角形

https://ac.nowcoder.com/acm/contest/3002/A

满足"好三角形"的情况只有两种:

1.底为1,高为2的三角形

2.底为2,高为1的三角形

然后自己去画图数一数就好了

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
ll n,m;
ll ans;
ll mod=1e9+7;
int main() {
  ios::sync_with_stdio(false);
  cin>>n>>m;
     ans=(n-2)*(m-1)*4%mod+(n-1)*(m-2)*4%mod;
    ans=(ans+2*(n-1)*(m-2)%mod*(m-2)%mod+2*(m-1)*(n-2)%mod*(n-2)%mod)%mod;
    ans=(ans+2*(n-2)*(m-1)%mod*(m-2)%mod+2*(m-2)*(n-1)%mod*(n-2)%mod)%mod;
  cout<<ans;
    return 0;
}

E.rin和快速迭代

https://ac.nowcoder.com/acm/contest/3002/E

直接暴力枚举到sqrt(n),要特别注意当枚举完的所得的因数是奇数时.

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
ll n;
int a,b;
int main() {
  ios::sync_with_stdio(false);
  cin>>n;
  while(n!=2){
      int flag=1;
      for(ll i=1;i*i<=n;i++){
          if(n%i==0){
              if(i*i==n)
                  flag=0;
              a++;
          }
      }
      if(flag==1) n=2*a;
      else      n=2*(a-1)+1;
      a=0;
      b++;
  }
  cout<<b;
    return 0;
}

G.eli和字符串

https://ac.nowcoder.com/acm/contest/3002/G

这道题很巧,和几天CF上的一道题非常的相似,这儿也一并提供原题,有兴趣的可以去看看:http://codeforces.com/contest/1295/problem/C

这题我们首先先将string中每个字母出现的次数存进一个数组当中,并记录字母出现最多的次数m,如果题目所给的t>m,直接输出-1.

接下来我们用一个二维的vector来记录string中每个字母的位置,然后从string的第一个字母开始进行遍历,如果当前字母之后出现的次数小与t,那么就不满足,直接遍历下一个.

否则,我们直接用二维的vector来找到当前字母之后的第t个相同字母的位置,并减去当前字母的位置,得到满足条件的连续子串的长度,用一个min函数来记录答案.

其实本题对于像我这样的菜鸡最大的难点在于这个二维vector的使用,大家可以去了解一下

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
int n,t;
int num[26];
int m=-1;
int ans=N;
int a[30]={0};
string s;
vector<int> A[N];
int main() {
    memset(num,0,26);
    for(int i=0;i<26;i++)
        A[i].clear();
  ios::sync_with_stdio(false);
  cin>>n>>t>>s;
  for(int i=0;i<n;i++){
      num[s[i]-'a']++;
      m=max(num[s[i]-'a'],m);
      A[s[i]-'a'].push_back(i);
  }
  if(t>m){
      cout<<-1;
      return 0;
  }
  else{
      for(int i=0;i<n;i++){
          if(num[s[i]-'a']>=t && t<=num[s[i]-'a']-a[s[i]-'a']){
              a[s[i]-'a']++;
             ans=min(A[s[i]-'a'][a[s[i]-'a']+t-2]-i+1,ans);
          }
      }
      cout<<ans;
  }
    return 0;
}

H.nozomi和字符串

https://ac.nowcoder.com/acm/contest/3002/H

这题是一道滑动窗口的经典题,大家可以去看看"滑动窗口"这个概念,具体的等我以后有时间再来补

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
int n,k;
string s;
int t[N];
int main() {
  ios::sync_with_stdio(false);
   cin>>n>>k>>s;
   int l=0;
   int r=0;
   int m=0;
   int ml=0;
   while(r<s.size()){
       t[s[r]]++;
       m=max(m,t[s[r]]);
       while(r-l+1-m>k){
         t[s[l]]--;
           l++;
       }
       ml=max(ml,r-l+1);
       r++;
   }
   cout<<ml;
    return 0;
}
原文地址:https://www.cnblogs.com/lr599909928/p/12264177.html