训练情况
赛后反思
CD连续卡题,D题树上层序遍历+加法原理,鉴定为基本的图论数据结构没学好
A题
直接打表,对于 i%3 = i%5 的情况,我们发现有三个一组,三个一组连续的数,每组第一个数之间差 15,所以我们 / 15 * 3 先把整组的数量算出来,再求是组内第几个,就能得到答案了
点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;cout<<n/15*3+min(3ll,n%15+1)<<endl;// for(int i = 0;i<=n;i++){// if((i%3)==(i%5)) cout<<i<<endl;// }
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}
B题
我们考虑简单的情况,如果没有 x,机器人直接从 0 开始,那它回到原点一定是 L 的数量 = R 的数量,所以我们找到回到原点所需的单次时间,次数就是总时间/单次时间,接下来就是考虑 x 的情况,我们先按照指令移动,看是否能达到原点,记录一下到达原点的时间,剩下的时间就是上述的操作循环
点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,x,k; cin>>n>>x>>k;string s; cin>>s;int z = 0,cnt1 = 0,cnt2 = 0;for(int i = 0;i<n;i++){if(s[i] == 'L') cnt1++;else if(s[i] == 'R') cnt2++;if(cnt1 == cnt2){z = i+1;break;}}// cout<<z<<endl;int ans = 0;int now = x;for(int i = 0;i<n;i++){if(k&&s[i] == 'L') now--,k--;else if(k&&s[i] == 'R') now++,k--;if(now == 0){ans++;if(z==0) break;ans += k/z;break;}}cout<<ans<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}