1.14-1.15 题解
A.统计字母的题,需要仔细看下题。
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <string.h> #include <cctype> #include <climits> #include <cmath> #include <time.h> using namespace std; typedef long long ll; const int N = 1e5+10; char ch[N]; int cnt[266]; int main() { scanf("%s",ch); for(int i=0;ch[i];i++) { cnt[ch[i]]++; } int ans = 0; ans = min(cnt['b'],cnt['l']); ans = min(min(cnt['u']/2,cnt['s']),min(ans,cnt['r'])); ans = min(cnt['B'],ans); ans = min(cnt['a']/2,ans); printf("%d\n",ans); return 0; }
B.筛。 也可以分解(质)因子,复杂度O(n*sqrt(max(si)))。T的同学应该是用了O(max(si))的做法分解因子
坑点,答案至少为1
#include<bits/stdc++.h> using namespace std; int arr[100022]; int main() { int n,ans=0,i,j; cin>>n; for(i=0;i<n;i++) { int a; scanf("%d",&a); arr[a]++; } for(i=2;i<=100000;i++) { int cum=0; for(j=i;j<=100000;j+=i) cum+=arr[j]; ans=max(cum,ans); } if(arr[1]>0) ans=max(ans,1); cout<<ans; return 0; }
#include<bits/stdc++.h> int cnt[100010]; int main(){ int n,ans=1; scanf("%d",&n); for(int k=1;k<=n;k++){ int x; scanf("%d",&x); for(int i=2;i<=sqrt(x);i++){//不要用i×i<=x if(x%i==0){ while(x%i==0) x/=i; cnt[i]++; } } if(x>1) cnt[x]++; } for(int k=1;k<=100000;k++) if(ans<cnt[k]) ans=cnt[k]; printf("%d",ans); }
C.模拟。一旦到达南北极,必须符合: 南极不能向东西南走,北极不能向东西北走。
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <map> using namespace std; typedef long long ll; const int N = 1e5+10; int main() { int n; cin>>n; char ch[10]; int l; int now = 0; bool mk = true; for(int i=0;i<n&&mk;i++) { cin>>l>>ch; if((ch[0]=='E'||ch[0]=='W')) if(now<20000&&now>0) continue; else mk = false; if(ch[0]=='S') { if(now+l>20000) { mk = false; } now = min(now+l,20000); } else{ if(now-l<0) { mk = false; } now = max(0,now-l); } } if(now==0&&mk) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }
D.相当于告诉你合法的条件,然后依次缩小区间,发现L>R自然无解,R 足够大则是inf 其他情况随便输出一个答案即可
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <map> #include <climits> using namespace std; typedef long long ll; const int N = 1e5+10; const int MAX = INT_MAX; int main() { int L = INT_MIN,R = INT_MAX; int pre=0,now,div; int n; scanf("%d",&n); for(int i = 0; i<n;i++) { scanf("%d%d",&now,&div); if(div==1) { L = max(L,1900-pre); } else{ R = min(R,1899-pre); } pre+=now; } if(L<=R) { if(R<MAX) printf("%d",R+pre); else printf("Infinity"); } else{ printf("Impossible"); } return 0; }
E.简单的搜索题,暴力for循环也能做。4×4的棋盘 ‘.’表示能下,连成至少三个获胜
#include<iostream> using namespace std; int main() { char a[20][20]; for(int i=6;i<10;i++) { for(int j=6;j<10;j++) { cin>>a[i][j]; } } for(int i=6;i<10;i++) { for(int j=6;j<10;j++) { if(a[i][j]=='.') { if((a[i+1][j]=='x' && a[i+2][j]=='x')||(a[i+1][j]=='x' && a[i-1][j]=='x') ||(a[i-1][j]=='x' && a[i-2][j]=='x') || (a[i][j+1]=='x' && a[i][j+2]=='x') || (a[i][j+1]=='x' && a[i][j-1]=='x') || (a[i][j-1]=='x' && a[i][j-2]=='x') || (a[i-1][j+1]=='x' && a[i-2][j+2]=='x') ||(a[i-1][j+1]=='x' && a[i+1][j-1]=='x') || (a[i+1][j-1]=='x' && a[i+2][j-2]=='x')|| (a[i-1][j-1]=='x' && a[i-2][j-2]=='x')|| (a[i-1][j-1]=='x' && a[i+1][j+1]=='x')||(a[i+1][j+1]=='x' && a[i+2][j+2]=='x')) { cout<<"YES"; return 0; } } } } cout<<"NO"; }