BestCoder Round #62 (div.2)(hdu5562,hdu5563,hdu5564(动态规划))

Clarke and food

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5562

解题思路:

可以证明从小到大一直拿,拿到不能拿为止是最优的。

所以排序一下即可。

中文题目:

问题描述
克拉克是一名人格分裂患者。某一天,克拉克变成了一个厨师,在采购食品。  
克拉克一共采购了nn个食物,每个食物有一个体积v_ivi。现在克拉克有一个容量为VV背包,他想用这个背包来装尽量多的食物。请你告诉他最多能装多少食物。  
输入描述
第一行一个整数T(1 \le T \le 10)T(1T10),表示数据的组数。  
每组数据第一行是两个整数n, V(1 \le n \le 10^5, 1 \le V \le 10^9)n,V(1n105,1V109),表示克拉克的数目和背包容量。  
接下来一行有nn个正数,第ii个整数表示v_i(1 \le v_i \le 10^9)vi(1vi109)
输出描述
每组数据输出一行一个数,表示答案。

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int a[100005];

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n,V;
        scanf("%d%d",&n,&V);
        for(int i = 0; i < n; i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        int ans = 0;
        while(V > 0){
            V -= a[ans++];
        }
        printf("%d\n",ans-1);
    }
    return 0;
}

Clarke and five-pointed star

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5563

解题思路:

容易看出只需要判断这5个点是否在一个正五边形上。

因此我们枚举排列,然后依次判断即可。

判定方法是,五条相邻边相等,五条对角线相等。

中文题目:

问题描述
克拉克是一名人格分裂患者。某一天克拉克分裂为一个几何学习者,在研究多边形。
在研究某一个多边形的时候,克拉克发现他多次遇到判断5个点是否能组成一个五角星的问题,在这里,这5个点分别代表五角星的五个顶点(顶角上的点)。于是他跑来想你求助,让你写出一个程序快速判定。即对于给出的5个点,判断这5个点是否能组成一个五角星。
输入描述
第一行一个整数T(1 \le T \le 10)T(1T10),表示数据的组数。
每组数据有55行,每行有两个实数x_i, y_i(-10^9 \le x_i, y_i \le 10^9)xi,yi(109xi,yi109),表示第ii个点的坐标。
输出描述
如果两个量相差小于10^{-4}104,则认为这两个量相等。
对于每组数据,如果这55个点能组成一个五角星,则输出YesYes,否则输出NoNo。(如果55个点相同,那么也能组成一个五角星。)

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const double eps = 1e-4;
struct node{
    double x,y;
}no[5];
double dis[5][5];

double get_dis(node a,node b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        for(int i = 0; i < 5; i++)
            scanf("%lf%lf",&no[i].x,&no[i].y);
        memset(dis,0,sizeof(dis));
        int flag = 1;
        for(int i = 0; i < 5; i++){
            for(int j = i+1; j < 5; j++){
                dis[i][j] = dis[j][i] = get_dis(no[i],no[j]);
            }
            sort(dis[i],dis[i]+5);
            if(dis[i][4]-dis[i][3] >= eps){
                flag = 0;
                break;
            }
        }
        if(flag)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

Clarke and digits

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5564

解题思路:

考虑dp,令d(i, j, k)d(i,j,k)表示长度为iiii位为jj余数为kk的方案数,则d(1, j, j \ mod \ 7) = 1, 0 < j < 10d(1,j,j mod 7)=1,0<j<10d(i+1, x, (k * 10+x) \ mod \ 7) += d(i, j, k)d(i+1,x,(k10+x) mod 7)+=d(i,j,k)。发现

转移相同,所以我们用矩阵快速幂来计算即可。题目要求前缀和,那么我们在矩阵里加一维就行了。

中文题目:

问题描述
克拉克是一名人格分裂患者。某一天,克拉克变成了一个研究人员,在研究数字。  
他想知道在所有长度在[l, r][l,r]之间的能被77整除且相邻数位之和不为kk的正整数有多少个。  
输入描述
第一行一个整数T(1 \le T \le 5)T(1T5),表示数据的组数。  
每组数据只有一行三个整数l, r, k(1 \le l \le r \le 10^9, 0 \le k \le 18)l,r,k(1lr109,0k18)
输出描述
每组数据输出一行一个数,表示答案。由于答案太大,你只需对10^9+7109+7取模即可。  

AC代码:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值