2021-12-5 学习的打卡学习第十三天(一些习题)

博客内容涉及多种编程问题的解决方案,包括罪犯问题、最优化矩形构造和完美团队分配。作者分享了他们的思路,并表示将在后续优化代码。此外,还有一道关于寻找礼物的最小拆盒次数问题,通过使用栈解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来今天打算用#include<graphics.h>把我的推箱子美化一下,可是codeblocks不支持,弄了一上午差一点连编译器本来的功能都不能用了。

还写了些题:

 n个罪犯排成一列,第 i 个罪犯手持长度为 Li 的机械利爪。当铃声响起时,每个人都会把站在自己前面的一些人杀掉。所有人都在同一时刻动手杀人。也就是说,当且仅当 j < i 并且 j ≥ i - Li 时,第 i 个人能杀掉第 j 个人。

给定机械利爪的长度,你需要计算出铃响之后还有多少人活着。

输入

第一行输入包含 1 个整数 n (1 ≤ n ≤ 106) —— 代表罪犯的数量。

第二行输入包含 n 个以空格间隔的整数 L1, L2, ..., Ln (0 ≤ Li ≤ 109) —— 代表第 i 个人手持的机械利爪的长度为 Li 。

输出

输出 1 个整数 —— 铃响之后还活着的人数。

样例

输入

4
0 1 0 10

输出

1

输入

2
0 0

输出

2

输入

10
1 1 3 0 0 0 2 1 0 3

输出

3

提示

第一个样例中,最后一个人杀了前面的所有人。

这题我时间超限了,但现在已经有了思路,明天把优化的代码发出来。

#include<stdio.h>
#include<stdlib.h>
#define N 1000000
typedef struct t
{
    int kill;
    int td;
};
struct t a[N];
int main()
{
    int n,i=0,j=0,r=0,z=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    scanf("%d",&a[i].kill);
    a[i].td=i+1;
    }
    for(i=1;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(j>=i)
                break;
            else
            {
                if(j>=i-a[i].kill)
                {
                   for(r=j;r<i;r++)
                        a[r].td=0;
                    break;
                }
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(a[i].td!=0)
            z++;
    }
    printf("%d",z);
    return 0;
}

还有这道:

由于达拉崩吧斑得贝迪卜多比鲁翁灭掉了巨龙昆图库塔卡提考特苏瓦西拉松,迎娶了公主米娅莫拉苏娜丹妮谢莉红,国王非常高兴,决定奖励达拉崩吧斑得贝迪卜多比鲁翁任意形状的矩形房子,面积不能超过10^5。达拉崩吧斑得贝迪卜多比鲁翁对国王说:我想要面积为n但周长最小的房子。国王说:好。

Input

输入的第一行也是唯一一行包含整数n(1≤n≤105),其中n是达拉崩吧斑得贝迪卜多比鲁翁房子的面积(平方米)。

Output

以米为单位打印所需达拉崩吧斑得贝迪卜多比鲁翁房子的最小周长。

Examples

Input

36

Output

24

Input

13

Output

28

Input

1

Output

4

Note

在第一个示例中,达拉崩吧斑得贝迪卜多比鲁翁房子的所需形状为6×6平方。其面积为36,周长为6+6+6+6=24。 在第二个示例中,达拉崩吧斑得贝迪卜多比鲁翁房子的所需形状为1×13矩形。其面积为13,周长为1+13+1+13=28。 在第三个示例中,达拉崩吧斑得贝迪卜多比鲁翁房子的所需形状为1×1平方。它的面积是1,周长是1+1+1+1=4。

思路:可以暴力,但时间会浪费很多。循环时暴力的第二个循环可以用计算式表示:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n,r=0,i=0,c=0,min=100000000;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        if(n%i==0)
        {
          r=n/i;
          c=2*(r+i);
          if(min>c)
            min=c;
        }
    }
    printf("%d",min);
    return 0;
}

还有这题,考验思维,它本身并难。

你可能已经知道一个标准的 ICPC参赛队正好由三名成员组成。然而,完美的团队有更多的限制。学生可以有一些专长:擅长打代码或擅长数学。一个人可以没有专长,但不能同时拥有两者。 因此,如果这个团队包括至少一个擅长打代码的成员,至少一个擅长数学的成员,并且正好由三个成员组成,那么这个团队就被认为是完美的。 你是一所非常流弊的大学的教练,你知道你的学生中有 c 个是擅长打代码的,m 个擅长数学,x 个没有专长的。 你能分配到的完美团队最多是多少? 请注意,有些学生可能没有团队,每个学生只能加入一个团队。
你被要求回答 q 个独立的问题。

Input

第一行包含一个整数 q (1≤q≤1e4) —查询数。 接下来的q行各包含三个整数 c 、m 和 x (0≤c、m、x≤1e8) ——分别是大学里擅长打代码的、擅长数学的和啥都不会的菜鸡学生(就是我)的数量。
请注意,没有学生两个都擅长。

Output

输出 q 个整数
按照它们在输入中给出的顺序排列。答案是你可以把你的学生分成的完全完美的团队的最大数量。

Example

输入:

6
1 1 1
3 6 0
0 0 0
0 1 1
10 1 10
4 4 1

输出:

1
3
0
0
1
3

代码:

#include<stdio.h>
#include<string.h>
int main()
{
    int n,i=0,a,b,c,e;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d %d %d",&a,&b,&c);
        e=(a+b+c)/3;
        if(a>b)
        {
            if(b>e)
                printf("%d\n",e);
            else
                printf("%d\n",b);
        }
        if(b>=a)
        {
            if(a>e)
                printf("%d\n",e);
            else
                printf("%d\n",a);
        }
    }
    return 0;
}

思路是要考虑e=(a+b+c)/3这种情况。

还有道水题:

小羊驼的生日快到了,他的爸爸妈妈准备给他一个小惊喜―送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,羊羊和驼驼准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。

用()表示一个盒子,B表示礼物,羊羊和驼驼想要你帮他们计算出他们对小羊驼的爱意值,即最少需要拆多少个盒子才能拿到礼物。

Input

本题目包含多组测试,请处理到文件结束。
每组测试包含一个长度不大于1000,只包含'(',')'和'B'三种字符的字符串,代表羊羊和驼驼设计的礼物透视图。
你可以假设,每个透视图画的都是合法的。

Output

对于每组测试,请在一行里面输出愚人指数。

Sample Input

((((B)()))())
(B)

Sample Output

4
1

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char a[1000];
    int n,i,b,d,z;
    while(~scanf("%s",a))
    {
        d=0;b=0;
        n=strlen(a);
        for(i=0;i<n;i++)
        {
            if(a[i]=='(')
                b++;
            if(a[i]==')')
                d++;
            if(a[i]=='B')
                break;
        }
        z=b-d;
        if(z<=0)
            printf("0\n");
        else
            printf("%d\n",z);
    }
    return 0;
}

栈还是不熟练,明天还要多看看,今天还做了好几道题时间超时,明天还要优化,今天先到这里吧。该休息一下了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值