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; }