Clarke and food
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5562
解题思路:
可以证明从小到大一直拿,拿到不能拿为止是最优的。
所以排序一下即可。
中文题目:
问题描述
克拉克是一名人格分裂患者。某一天,克拉克变成了一个厨师,在采购食品。 克拉克一共采购了n个食物,每个食物有一个体积vi。现在克拉克有一个容量为V背包,他想用这个背包来装尽量多的食物。请你告诉他最多能装多少食物。
输入描述
第一行一个整数T(1≤T≤10),表示数据的组数。 每组数据第一行是两个整数n,V(1≤n≤105,1≤V≤109),表示克拉克的数目和背包容量。 接下来一行有n个正数,第i个整数表示vi(1≤vi≤109)。
输出描述
每组数据输出一行一个数,表示答案。
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≤T≤10),表示数据的组数。 每组数据有5行,每行有两个实数xi,yi(−109≤xi,yi≤109),表示第i个点的坐标。
输出描述
如果两个量相差小于10−4,则认为这两个量相等。 对于每组数据,如果这5个点能组成一个五角星,则输出Yes,否则输出No。(如果5个点相同,那么也能组成一个五角星。)
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)表示长度为i第i位为j余数为k的方案数,则d(1,j,j mod 7)=1,0<j<10, d(i+1,x,(k∗10+x) mod 7)+=d(i,j,k)。发现
转移相同,所以我们用矩阵快速幂来计算即可。题目要求前缀和,那么我们在矩阵里加一维就行了。
中文题目:
问题描述
克拉克是一名人格分裂患者。某一天,克拉克变成了一个研究人员,在研究数字。 他想知道在所有长度在[l,r]之间的能被7整除且相邻数位之和不为k的正整数有多少个。
输入描述
第一行一个整数T(1≤T≤5),表示数据的组数。 每组数据只有一行三个整数l,r,k(1≤l≤r≤109,0≤k≤18)。
输出描述
每组数据输出一行一个数,表示答案。由于答案太大,你只需对109+7取模即可。
AC代码: