A
https://www.nowcoder.com/acm/contest/107/A
判断输入的字符串对应的0-10的英文单词
#include<bits/stdc++.h> using namespace std; int main(){ int n; int t; cin>>t; while(t--) { char a[11]; cin>>a; if(a[0]=='z') { cout<<"ling"<<endl; } else if(a[0]=='o') { cout<<"yi"<<endl; } else if(a[0]=='t') { if(a[1]=='w') cout<<"er"<<endl; else if(a[1]=='h') cout<<"san"<<endl; else cout<<"shi"<<endl; } else if(a[0]=='f') { if(a[1]=='o') cout<<"si"<<endl; else cout<<"wu"<<endl; } else if(a[0]=='s') { if(a[1]=='i') cout<<"liu"<<endl; else cout<<"qi"<<endl; } else if(a[0]=='e') { cout<<"ba"<<endl; } else if(a[0]=='n') { cout<<"jiu"<<endl; } } return 0; }
B
https://www.nowcoder.com/acm/contest/107/B
按题意暴力膜一发
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; int main() { char c[22]; int s[33]; int n; while(cin>>c) { memset(s,0,sizeof(s)); for(int i=0;c[i];i++) { s[c[i]-'a']++; } cin>>n; int res=0; while(n--) { cin>>c; bool flag=0; for(int i=0;c[i];i++) { if(s[c[i]-'a']) { s[c[i]-'a']--; } else { flag=1; break; } } if(!flag) { int cmp=strlen(c); res=max(res,cmp); } } cout<<res<<endl; } return 0; }
D
https://www.nowcoder.com/acm/contest/107/D
答案就是平均数的整数部分
#include<bits/stdc++.h> using namespace std; int main(){ int n; int t; cin>>t; while(t--) { int s=0; cin>>n; for(int i=0;i<n;i++) { int a; cin>>a; s+=a; } int ans=s/n; cout<<ans<<endl; } return 0; }
C
https://www.nowcoder.com/acm/contest/107/C
按题意暴力膜一发
#include<bits/stdc++.h> using namespace std; int ans[3333333]; int a[2555]; int main(){ int n; int t; cin>>t; while(t--) { int s=0; cin>>n; int k; cin>>k; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int js=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { ans[js++]=min(a[i],a[j]); } } sort(ans,ans+js); cout<<ans[js-k]<<endl; } return 0; }
E
https://www.nowcoder.com/acm/contest/107/E
求2进制子串能整除3的个数
dp,dp[i]表示以第i个数为结尾的子串mod 3 =0的个数,dp1[i]表示以第i个数为结尾的子串mod 3 =1的个数
dp2[i]表示以第i个数为结尾的子串mod 3 =2的个数,那么 递推更新状态就很简单了,长度每增加一位,那么就等于前面串的mod 3的值*2+当前位的值(0或者1),再把结果mod 3 得到当前dp的状态,要注意如果当前位为0则dp[i]要记得加上本身的一次
当前位为1也是如此
#include<bits/stdc++.h> using namespace std; long long dp[1111111]; long long dp1[1111111]; long long dp2[1111111]; char s[1111111]; int main(){ while(~scanf("%s",s)) { if(s[0]=='0') { dp[0]=1; dp1[0]=0; dp2[0]=0; } else { dp[0]=0; dp1[0]=1; dp2[0]=0; } int l=strlen(s); for(int i=1;i<l;++i) { if(s[i]=='0') { dp[i]=1+dp[i-1]; dp1[i]=dp2[i-1]; dp2[i]=dp1[i-1]; } else{ dp[i]=dp1[i-1]; dp1[i]=1+dp[i-1]; dp2[i]=dp2[i-1]; } } long long ans=0; for(int i=0;i<l;++i) { ans+=dp[i]; } cout<<ans<<endl; } return 0; }
G
https://www.nowcoder.com/acm/contest/107/G
经过队友打表发现,ans(n)=ans(a)+ans(b)且n=a*b
质数的答案肯定是本身-1 m, 因此就可以打表了
#include<bits/stdc++.h> using namespace std; bool zs[1111111]; int yz[1111111]; int ans[1111111]; void init(){ memset(zs,0,sizeof(zs)); ans[1]=0; zs[1]=1; yz[1]=1; for(long long int i=2;i<=1000000;i++) { if(zs[i]!=1) { ans[i]=i-1; for(long long int j=i*i;j<=1000000;j+=i) { yz[j]=i; zs[j]=1; } } } for(int i=2;i<=1000000;i++) { if(zs[i]==1) { ans[i]=ans[yz[i]]+ans[i/yz[i]]; } } } int main(){ init(); int t; cin>>t; while(t--) { int n; scanf("%d",&n); printf("%d\n",ans[n]); } return 0; }
F
https://www.nowcoder.com/acm/contest/107/F
vector搞一搞 操作系统
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; bool s[50050]; int a[50050]; vector<int>vec; vector<int>::iterator it; int main() { int n,m,q; while(cin>>n>>m>>q) { for(int i=1;i<=m;i++) s[i]=0; for(int i=0;i<q;i++) cin>>a[i]; vec.clear(); int ans=0; for(int i=0;i<q;i++) { if(s[a[i]]) continue; else { ans++; int res=0; int cmp=0; if(vec.size()<n) { s[a[i]]=1; vec.push_back(a[i]); continue; } for(int ii=0;ii<vec.size();ii++) { bool flag=0; for(int j=ii+1;j<q;j++) { if(vec[ii]==a[j]) { flag=1; if(j>cmp) { cmp=j; res=ii; } break; } } if(!flag) { res=ii; break; } } s[vec[res]]=0; vec.erase(vec.begin()+res); s[a[i]]=1; vec.push_back(a[i]); } } cout<<ans<<endl; } return 0; }