• [CSP-S模拟测试]:装饰(数学)


    题目传送门(内部题147)


    输入格式

      每个测试点第一行一个正整数$T$,表示该测试点内的数据组数。
      接下来$T$行,每行三个非负整数$a,b,c$,含义如题目中所示。


    输出格式

      对每组数据输出一行一个非负整数表示答案。


    样例

    样例输入:

    5
    1 2 3
    5 0 0
    9 1 1
    5 5 4
    0 6 6

    样例输出:

    2
    0
    2
    4
    4


    数据范围与提示

    样例解释:

      第一组数据中,可以装饰出红黄蓝、黄蓝蓝两张桌子;
      第二组数据中只有红色的气球,无法装饰任何桌子;
      第三组数据中,只能装饰两张桌子,颜色分别为红红黄和红红蓝,而剩下的$5$个红色气球无法使用。
      第四组数据中,可以装饰四张颜色为红黄蓝的桌子,剩余的一个红色气球和一个蓝色气球无法使用。
      最后一组数据中,可以装饰黄蓝蓝和黄黄蓝的桌子各两张。

    数据范围:

      对于$30\%$的数据,有$a,b,cleqslant 5$,
      对于$60\%$的数据,有$a,b,c,Tleqslant 500$,
      对于$100\%$的数据,有$0leqslant a,b,cleqslant 1000000000$(即$1000^3$),$1leqslant Tleqslant 20,000$。


    题解

    先说一下$60\%$的暴力吧。

    设$dp[i][j][k]$表示红色有$i$个,黄色有$j$个,蓝色有$k$个的情况下最多能装饰几个桌子。

    有转移:

    $$dp[i][j][k]=max(dp[i-1][j-1][k-1],dp[i-2][j-1][k],dp[i-1][j-2][k],dp[i-2][j][k-1],dp[i-1][j][k-2],dp[i][j-2][k-1],dp[i][j-1][k-2])$$

    注意空间问题(不然会$MLE0$,比方说某同桌),但是因为答案很小,所以用$short$就好啦。

    正解其实是找规律找出来的,无意间发现当数量最少的两个球相加乘$2$还比另一个球少的情况下答案就是这两个球的加和;否则答案就是三个球数量加和的$frac{1}{3}$。

    时间复杂度:$Theta(T)$。

    期望得分:$100$分。

    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    long long a[3];
    int main()
    {
    	int T;scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%lld%lld%lld",&a[0],&a[1],&a[2]);sort(a,a+3);
    		printf("%lld
    ",(a[0]+a[1])*2<a[2]?a[0]+a[1]:(a[0]+a[1]+a[2])/3);
    	}
    	return 0;
    }
    

    rp++

  • 相关阅读:
    datatable删除一行方法
    jquery绑定事件的坑,重复绑定问题
    jquery表单重置
    koa中上传文件到阿里云oss实现点击在线预览和下载
    koa2使用阿里云oss的nodejs sdk实现上传图片
    input元素默认选中设置
    koa使用koa-passport实现路由进入前登录验证
    jquery获取select多选框选中的值
    jquery方法.serializeArray()获取name和value并转为json数组
    jquery获取表单数据方法$.serializeArray()获取不到disabled的值
  • 原文地址:https://www.cnblogs.com/wzc521/p/11845369.html
Copyright © 2020-2023  润新知