又一次滑铁卢掉分 ๐·°(৹˃̵﹏˂̵৹)°·๐
第一题卡了20分钟没做出来直接影响到后面的状态
第一题没有AC大概率是思路上的错误,一定要重新看题想一想,像做脑筋急转弯一样,多扩散地想
BC题都做麻烦了,以后AC的题也该多看看大佬的题解,吸取他们快速AC的思路
第一题
第一次提交的思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<bits/stdc++.h> using namespace std; #define maxn 200010 #define MOD 998244353 #define ll long long #define endl '\n'
int main() { int t; cin>>t; while(t--) { ll n; cin>>n; ll ans=0; while(n>=2){ if(n%3==0){ n/=3; ans+=n; }else{ n=n/3+1; ans+=n-1; } } cout<<ans<<endl; } return 0; }
|
正确思路
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include<bits/stdc++.h> using namespace std; #define maxn 200010 #define MOD 998244353 #define ll long long #define endl '\n'
int main() { int t; cin>>t; while(t--) { ll n; cin>>n; if(n==3){ cout<<1<<endl; continue; } cout<<(n-1)/2<<endl;; } return 0; }
|
第二题
也是做麻烦了,实际上模拟就好了,一次/2就是logn复杂度的,特判一个全是-1的情况就够了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include<bits/stdc++.h> using namespace std; #define maxn 200010 #define MOD 998244353 #define ll long long #define endl '\n'
int main() { int t; cin>>t; while(t--) { int n,q; cin>>n>>q; string ss; cin>>ss; vector<int> a(q+10); vector<int> s(40); bool flag=0; for(int i=1;i<=q;i++){ cin>>a[i]; } int cnt=0; if(ss[0]=='A'){ s[++cnt]=1; }else{ flag=1; s[++cnt]=-1; if(n!=1) cnt++; } for(int i=2;i<=n;i++){ if(ss[i-1]=='A'){ s[cnt]++; }else{ flag=1; s[++cnt]=-1; if(i==n||ss[i]=='B') continue; cnt++; } } for(int i=1;i<=q;i++){ if(flag==0){ cout<<a[i]<<endl; continue; } int ans=0,ind=1; while(a[i]>0){ if(s[ind]!=-1&&a[i]<=s[ind]){ ans+=a[i]; break; } if(s[ind]==-1){ ans++; a[i]/=2; }else{ a[i]-=s[ind]; ans+=s[ind]; } ind++; if(ind>cnt) ind=1; } cout<<ans<<endl; } } return 0; }
|
第三题
也是做麻烦了,思路麻烦再加上码力差,被pos和lower_bound的切换绕进去了,debug了一小时才AC
我的AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<bits/stdc++.h> using namespace std; #define maxn 200010 #define MOD 998244353 #define ll long long #define endl '\n'
int main() { int t; cin>>t; while(t--) { int n,k; cin>>n>>k; vector<int> a(n+10); for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a.begin()+1,a.begin()+n+1); int pre=1; vector<int> num(n+10); int ans=1; for(int i=1;i<=n;i++){ int pos=lower_bound(a.begin()+1,a.begin()+n+1,i*4)-a.begin(); pos--; for(int j=pre;j<=pos;j++){ num[a[j]]++; for(int k=2;k*k<=a[j];k++){ if(a[j]%k==0){ num[k]++; if(k==a[j]/k){ continue; } num[a[j]/k]++; } } } pre=pos+1; if(pos-num[i]<=k){ ans=i; } } cout<<ans<<endl; } return 0; }
|
codeboy大神的思路和代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| constexpr int N = 200005; int b[N], sum[N]; int n, k; signed main() { fastio(); int T; cin >> T; while(T--) { cin >> n >> k; meset(b, 0); Fe(i, 1, n) { int x; cin >> x; ++b[x]; } sum[0] = 0; Fe(i, 1, n) sum[i] = sum[i - 1] + b[i]; int ans = 1; Fe(i, 1, n) { int R = 4 * i - 1; if(R > n) R = n; int nd = sum[R]; if(i <= n) nd -= b[i]; if(2 * i <= n) nd -= b[2 * i]; if(3 * i <= n) nd -= b[3 * i]; if(nd <= k) ans = i; } cout << ans << endl; } return 0; }
|