Codeforces Round #828 (Div. 3)-C+D
C
题目链接:https://codeforces.com/contest/1744/problem/C
C题一开始有个暴力的思路,就是从前往后搜索,找到当前c所对应的最近的g的路径,同时记录最大值。但是这个是O(n2)的时间复杂度,我猜可能过不了。《===待尝试
看了官方的解析,现在思考为什么他的方法是O(n)。其实我的想法也可以O(n),但是我更习惯于暴力搜索,所以说,还是题目做的太少了。
两个亮点:
①将string s复制一遍放在s的后面,方便直接计算需要首尾循环的最短长度。
②从后往前遍历数组,同时记录g的位置,一减即得当前的最短,再用ans统计答案即可。
最终代码:
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 | #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<vector> #define ll long long #define ull unsigned long long #define mem(x,y) memset(x,y,sizeof(x)) //#define int long long inline ll read() { ll x=0,f=1; char ch= getchar (); while (ch< '0' ||ch> '9' ){ if (ch== '-' ) f=-1;ch= getchar ();} while (ch>= '0' &&ch<= '9' ){x=x*10+ch-48;ch= getchar ();} return x*f; } using namespace std; const int maxm=2e5+5,inf=0x3f3f3f3f; int n; char c; string ss; void solve(){ cin>>n>>c>>ss; ss+=ss; int len=ss.length(),lastg=-1,ans=0; for ( int i=len-1;i>=0;--i){ if (ss[i]== 'g' ) lastg=i; else if (ss[i]==c&&lastg!=-1) ans=max(ans,lastg-i); } cout<<ans<<endl; return ; } signed main(){ // ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int _=1; cin>>_; while (_--){ solve(); } return 0; } |
D
题目链接:https://codeforces.com/contest/1744/problem/D
这道题目,主要就是判断能不能找到足够的因子2,让其可以被2n整除。中途有许多值得注意的地方,详见代码吧,夜深了现在。
时间复杂度和空间复杂度都蛮高的,仅供参考思路。
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 72 73 74 75 76 77 78 79 | #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<map> #include<vector> #define ll long long #define ull unsigned long long #define mem(x,y) memset(x,y,sizeof(x)) //#define int long long inline ll read() { ll x=0,f=1; char ch= getchar (); while (ch< '0' ||ch> '9' ){ if (ch== '-' ) f=-1;ch= getchar ();} while (ch>= '0' &&ch<= '9' ){x=x*10+ch-48;ch= getchar ();} return x*f; } using namespace std; const int maxm=2e5+5,inf=0x3f3f3f3f; ll n,a,y[maxm]; map< int , int > s; void solve(){ cin>>n; s.clear(); int ans=-1,cur=0,temp; for ( int i=0;i<n;++i){ cin>>a; if (s[a]==0){ temp=a; while (temp%2==0){ ++s[a]; temp/=2; } } cur+=s[a]; } // cout<<n<<"..."<<cur<<endl; int cnt[20]{}; if (cur<n){ //此处判断存在一点小小的复杂情况 for ( int i=1;i<=n;++i){ ++cnt[y[i]]; } ans=0; for ( int i=19;i>=0;--i){ while (cur<n&&cnt[i]){ cur+=i; //此处是i不是cnt[i] --cnt[i]; ++ans; } } if (cur<n) ans=-1; } else ans=0; cout<<ans<<endl; return ; } signed main(){ int c; for ( int i=1;i<maxm;++i){ c=i; while (c%2==0){ ++y[i]; c/=2; } } // ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int _=1; cin>>_; while (_--){ solve(); } return 0; } |
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/16803934.html
分类:
oj - Codeforces
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)