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

先求出每个数的得分情况,分数和得分状态,(1<<4)种状态

按分数从大到小排序 然后每种状态取一个数(如果有的话)

然后对 dp[i][j] 进行背包 dp[i][j] 表示的是选了i个数选的总状态为j情况下的最大值

然后根据每个 dp[i][j] 对数组剩余的数进行最优选择(在不破坏 最终状态 j 的情况下,尽量选单位分数高的)

最后求最大的情况

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>
#include<stdexcept>
#include<bitset>
#include<cassert>
#include<deque>
#include<numeric> using namespace std; typedef long long ll;
typedef unsigned int uint;
const double eps=1e-12;
const int INF=0x3f3f3f3f;
const ll MOD=1000000007;
const int H=1000005;
const int K=10005;
const int N=1005;
const int M=(1<<4);
struct node
{
int a,b;
int point,k;
}in[N];
bool prime(int x)
{
if(x==1) return false;
for(int i=2;i*i<=x;++i)
if(x%i==0)
return false;
return true;
}
void get(node &x)
{
int a=x.a;
int num=0,sum=0;
for(int i=1;i*i<=a;++i)
if(a%i==0)
{
++num;
sum+=i;
int j=a/i;
if(i!=j)
{++num;sum+=j;}
}
x.k=0;x.point=0;
if(num==2)
{x.point++;x.k|=1;}
if(prime(num))
{x.point++;x.k|=2;}
if(prime(sum))
{x.point++;x.k|=4;}
int h=(int)(sqrt(1.0*a)+0.5);
int h1=(int)(sqrt(1.0*h)+0.5);
if(a==1||((num&1)==0&&((num>>1)&1)==0)||((num&1)==1&&h1*h1==h))
{x.point++;x.k|=8;}
}
bool cmp(node x,node y)
{
return x.point>y.point;
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("1011.in","r",stdin);
//freopen("1011.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;++i)
{
scanf("%d %d",&in[i].a,&in[i].b);
get(in[i]);
if(i>0) printf(" ");
printf("%d",in[i].point);
}
printf("\n");
int bit[4];
for(int i=0;i<4;++i)
scanf("%d",&bit[i]);
sort(in,in+n,cmp);
int dp[20][20];
memset(dp,-1,sizeof(dp));
dp[0][0]=0;
bool had[20];
memset(had,false,sizeof(had));
for(int i=0;i<n;++i)
if(had[in[i].k]==false)
{
had[in[i].k]=true;
node &w=in[i];
for(int i=M-1;i>=0;--i)
for(int j=0;j<M;++j)
if(dp[i][j]!=-1)
{
int l=i+1;
int r=(j|w.k);
dp[l][r]=max(dp[l][r],dp[i][j]+w.point);
}
w.b--;
}
int ans=-INF;
for(int i=0;i<=16;++i)
for(int j=0;j<16;++j)
if(i<=k&&dp[i][j]!=-1)
{
int sum=dp[i][j];
for(int l=0;l<4;++l)
if((j&(1<<l))==0)
sum+=bit[l];
int w=k-i;
for(int l=0;w>0&&l<n;++l)
if((j|in[l].k)==j)
{
if(w>=in[l].b)
{
w-=in[l].b;
sum+=(in[l].b*in[l].point);
}else
{
sum+=(w*in[l].point);
w=0;
}
if(w==0)
break;
}
if(w==0)
ans=max(ans,sum);
}
printf("%d\n",ans);
}
return 0;
}

hdu 4610 Cards的更多相关文章

  1. HDU 4610 Cards (合数分解,枚举)

    Cards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. 【 2013 Multi-University Training Contest 1 】

    HDU 4602 Partition f[i]表示和为i的方案数.已知f[i]=2i-1. dp[i]表示和为i,k有多少个.那么dp[i]=dp[1]+dp[2]+...+dp[i-1]+f[i-k ...

  3. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...

  4. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  5. HDU 1535 Invitation Cards(逆向思维+邻接表+优先队列的Dijkstra算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1535 Problem Description In the age of television, n ...

  6. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  7. HDU 1535 Invitation Cards(最短路 spfa)

    题目链接: 传送门 Invitation Cards Time Limit: 5000MS     Memory Limit: 32768 K Description In the age of te ...

  8. hdu 1535 Invitation Cards

    http://acm.hdu.edu.cn/showproblem.php?pid=1535 这道题两遍spfa,第一遍sfpa之后,重新建图,所有的边逆向建边,再一次spfa就可以了. #inclu ...

  9. HDU SPFA算法 Invitation Cards

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 分析: 题意:求1点到其它点的最短距离之和+其它点到1点的最短距离之和 前面一部分直接用SPFA ...

随机推荐

  1. poj1265Area(pick定理)

    链接  Pick定理是说,在一个平面直角坐标系内,如果一个多边形的顶点全都在格点上,那么这个图形的面积恰好就等于边界上经过的格点数的一半加上内部所含格点数再减一. pick定理的一些应用 题意不好懂, ...

  2. 26个Jquery使用小技巧

    下面列出了一些Jquery使用技巧.比如有禁止右键点击.隐藏搜索文本框文字.在新窗口中打开链接.检测浏览器.预加载图片.页面样式切换.所有列等高.动态控制页面字体大小.获得鼠标指针的X值Y值.验证元素 ...

  3. epoll函数与参数总结学习 & errno的线程安全

    select/poll被监视的文件描述符数目非常大时要O(n)效率很低:epoll与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以 ...

  4. POJ 3260 多重背包+完全背包

    前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...

  5. xcode黑科技

    1多开模拟器 使用命令行: cd /Applications/Xcode1.app/Contents/Developer/Applications/&open -n Simulator.app ...

  6. Java 数据类型之间的转换 拆分字符串 Date/Calendar的转换

    数据类型转换 1. String - Int String str="123"; int i=1; int str=Integer.parseInt(str); String i= ...

  7. 出现 could not open jvm.cfg 的解决办法

    出现该的原因很可能是由于卸载 jdk 不干净而引起的(就算是使用工具也一样),在oracle的官方上也是让我们卸载了重装一次.可是重装真的能解决问题吗?  以下方法经过本人的验证,绝对可行! (一定要 ...

  8. 利用ADO.NET导出大批量数据

    2015年12月,XX项目中需要做一个数据导出功能,当时所有页面的到处功能均已经实现,但有个页面数据量太大,导出过程中导出页面直接卡死.不得已我准备选用ADO.NET来重新完成这个功能,因为考虑到越偏 ...

  9. RemoteWebDriver管理

    直接贴代码: @Parameters({"BrowserType","NodeIP","NodePort"}) public void be ...

  10. 【bzoj1046】上升序列

    [bzoj1046]上升序列 题意 对于一个给定的S={a1,a2,a3,-,an},若有P={ax1,ax2,ax3,-,axm},满足(x1 < x2 < - < xm)且( a ...