ACWING 第26场周赛总结
❝接下来写一下收获与总结:
❞
AC4076 模拟
模拟题
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int res = 1;
for(int i = 1; i < s.length(); i++){
if(s.charAt(i)=='1'){
res += 10;
continue;
}
res += s.charAt(i)-'0';
}
System.out.println(res);
}
}
AC4077 二分或者直接遍历
这道题通过数据范围来看要使用nlogn的方法,因此我们可以使用二分答案的方法,确定大于的第一个值,关键是check方法的书写。
第二种可以使用O(N)的方法去写,这题我学到了边界情况的处理和要经常使用pre,curr来存储需要的答案,关键是要看出题意的需求!!!
#include<bits/stdc++.h>
using namespace std;
string s;
bool check(int mid){
for(char i = 'a'; i <= 'z'; i++){
int cnt = 0;
bool flag = false;
for(int j = 0; j < s.size();j++){
if(i!=s[j]){
cnt++;
}else{
cnt = 0;
}
if(cnt >= mid){
flag = true;
}
}
if(!flag){
return true;
}
}
return false;
}
int main(){
cin >> s;
int n = s.size();
int l = 1, r = n;
while(l < r){
int mid = (l+r) >> 1;
if(check(mid)){
r = mid;
}else{
l = mid+1;
}
}
cout << l << endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
cin >> s;
//实现思路
//就是找每个值的最小值
int ans = 1e9;
int n = s.size();
for(char i = 'a'; i <= 'z'; i++){
//处理边界
int pre = -1,cur = 0;
for(int j = 0; j < (int)s.size(); j++){
if(i ==s[j]){
cur = max(cur, j - pre);
pre = j;
}
}
//处理最后的边界
cur = max(cur,n-pre);
ans = min(cur,ans);
}
cout << ans << endl;
return 0;
}
第三题 AC4077 经典DP
关键是看出是DP问题,从而先去确立状态,然后再去确定状态方程
//状态表示: dp[i]表示以第i个字符结尾的优秀子串的集合 属性:数量
// 状态计算: dp[i][j] = (以0结尾)dp[i-1][0] + (以1结尾)dp[i-k][1]
#include<bits/stdc++.h>
using namespace std;
const int N = 100010,MOD = 1e9+7;
int t,k;
int dp[N];
void solve()
{
dp[0] = 1;
for(int i = 1; i <= N; i++){
dp[i] = dp[i-1];
if(i-k>=0){
dp[i] = (dp[i]+dp[i-k])%MOD;
}
}
for(int i = 1; i <= N; i++){
dp[i] = (dp[i]+dp[i-1])%MOD;
}
}
int main()
{
cin >> t >> k;
int l,r;
solve();
while(t--){
cin >> l >>r;
cout << (dp[r] - dp[l-1]+MOD)%MOD <<endl;
}
return 0;
}