每日一题汇总

Partition

题目:
给你两个数 N 和 M。
现在让你找出一个有 N 项的序列 a,a1+a2+…+aN = M,使得 gcd(a1,a2,…aN) 最大,输出这个gcd(a1,a2,…aN)。
每个 ai 都是正数。
在这里插入图片描述
在这里插入图片描述
分析:设最大的gcd为x,那么a1=x * i1,a2=x * i2,……an = x * in,x * (i1+i2+i3……+in) = M,所以x也是M的一个因子,只有当M/x >= N时,x才符合题意,所以我们只用枚举M的因子,再取max。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,i,g=1;
    scanf("%d%d",&n,&m);
    for(i=1; i<=sqrt(m); i++)//枚举m的因子 因为i的枚举范围为1到sqrt(m),所以m的因子除了i还有m/i
    {
        if(m%i == 0)
        {
            if(m/i >=n)//如果m/i大于等于n,则说明m的因子i符合题意
                g = max(i,g);
            if(i >= n)//如果i大于等于n,则说明m的因子m/i符合题意(因为m/(m/i) >= n)
                g = max(m / i,g);
        }
    }
    printf("%d",g);
}

Two Cakes

题目:
现在有n个盘子,两种蛋糕,第一个蛋糕被切成a块,第二个蛋糕被切成b块,要满足:
1.每块蛋糕都要放在盘子上
2.每个盘子至少包含一块蛋糕
3.每个盘子不可以同时出现两种蛋糕
现在要最大限度地减少每个盘子上的蛋糕块数(即让蛋糕分配均匀),每块盘子都至少有x块蛋糕,现在要求x的最大值。
在这里插入图片描述
在这里插入图片描述
分析:留意到a,b的取值范围,为1到100,那么很容易想到直接枚举每一种情况,求x的最小值就是了。

#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
    int n,a,b,i,c1,c2,ans=0;
    scanf("%d%d%d",&n,&a,&b);
    if (n==a+b)//分情况讨论,当a+b=n的时候,x的值为1
    {
        ans = 1;
    }
    else
        for(i=1;i<n;i++)//因为同一个盘子上不能有两种蛋糕,所以如果一种蛋糕占了i个盘子,那么另一种蛋糕一定占n-i个盘子
        {
            c1 = a / i;
            c2 = b / (n-i);
            ans = max(ans,min(c1,c2));//min(c1,c2)是每种情况下的x,ans是当前最大的x
        }
    printf("%d",ans);
}

Bracket Subsequence

题目:
括号序列是仅包含字符“(”和“)”的字符串。 常规括号序列是一个括号序列,可以通过在序列的原始字符之间插入字符“1”和“+”来转换为正确的算术表达式。 例如,括号序列“()()”和“(())”是常规的(结果表达式为:“(1)+(1)”和“((1 + 1)+1)”),以及 “)(”,“(”和“)”不是。
子序列是可以通过删除一些元素而不改变其余元素的顺序从另一个序列导出的序列。
给定一个常规括号序列s和一个整数k。 你的任务是找到一个长度恰好为k的常规括号序列,这样它也是s的子序列。
保证这样的序列始终存在。
在这里插入图片描述
在这里插入图片描述
分析:因为该子序列的()要为完整,且不能出现)(,所以当存入新数组的左括号数小于2/k时,就可以继续往里存左括号,当存入新数组的右括号数小于左括号数时,才可以继续往里存右括号,从第一个符合开始遍历数组即可。

#include <stdio.h>
char a[200005],b[200005];
int main()
{
    int k,n,i,j=0,cl=0,cr=0;
    scanf("%d%d",&n,&k);
    scanf("%s",a);
    for(i=0; i<n; i++)
    {
        if(a[i] == '(' && cl < k / 2)
        {
            b[j] = a[i];
            j++;
            cl++;
        }
        if(a[i] == ')' && cr < cl)
        {
            b[j] = a[i];
            j++;
            cr++;
        }
    }
    for(i=0; i<k; i++)
        printf("%c",b[i]);
}

猜你喜欢

转载自blog.csdn.net/weixin_43678350/article/details/84900878