Task 4 (p 105)

T1

题目大意:

有一段括号序列,将一个括号修改一次需要1的代价(将左括号变成右括号或者相反),求最小代价使得括号序列合法。

简单分析:

简单的括号匹配, 模拟一下就好

标算:
#include<cstdio>
#include<cstring>
const int N = 100000 + 10;
int n, st, tmp;
char s[N];
int main() {
    scanf("%s", s+1);
    n = strlen(s+1), st = 0, tmp = 0;
    for(int i = 1; i <= n; ++i) {
        if(s[i] == '(') st++;
        else if(st) st--;
        else if(!st) tmp++;
    }
    printf("%d\n", (st+1)/2 + (tmp+1)/2);
    return 0;
}

T2

题目大意:

给定N,k,询问不超过N的数中能够表示成连续k个质数之和的最大的数是多少

简单分析:

挨个试一试就好了

标算:

先筛出全部素数, 前缀和统计一下
二分这一段连续素数的起点终点
注意无解情况的判定

#include<cstdio>
typedef long long ll;
const int N = 1000000+10;
int pri[N], cnt;
bool yes[N];
ll sp[N];
inline void pre() {
    for(int i = 2; i <= N-10; ++i) { //线性筛素数 
        if(!yes[i]) pri[++cnt] = i;
        for(int j = 1; i*pri[j] <= N-10; ++j) {
            yes[i*pri[j]] = true;
            if(i%pri[j] == 0) break;
        }
    }
    for(int i = 1; i <= cnt; ++i) sp[i] = sp[i-1] + pri[i];
    // sum of prime素数前缀和 
}
int main() {
    pre();
    int kase;
    scanf("%d", &kase);
    while(kase--) {
        int n, k;
        scanf("%d%d", &n, &k);
        int l = 1, r = cnt-k+2;
        if(r <= l) {
            printf("-1\n");
            continue;
        }
        while(l+1 != r) { //二分这一段连续素数的起点 终点 
            int m = (l+r)>>1;
            if(sp[m+k-1]-sp[m-1] > n) r = m;
            else l = m;
        }
        if(sp[l+k-1]-sp[l-1] <= n) 
            printf("%d\n", (int)(sp[l+k-1]-sp[l-1]));
        else printf("-1\n");
    }
    return 0;
}

T3

不可做的题目大意:
用命分析:
咋都看不懂的标算:
这里写代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值