啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,一开始我就不知道怎么写,然后看了题解是状压DP,后来去看了看状压DP也就这样嘛,但是难点,可以说是不熟悉的地方吧。。。如下:

第一、我们能很快的知道状压DP的原理:

就比如我们要考虑一些状态的时候,比如做这题做作业,有N[0 , 15]个作业,我们要表示1,2,3,….,n个作业的状态,我们可以用1/0来表示作业的状态是做完或者没做完。1101 :1号做完,3号做完,4号做完,加入我们开一个数组,当然1e15大的数组也不行,当然如果N再小一点,我们硬要去用数组存起来,那么那些156,8494这样的下标就变得没有意义。所以,我们可以利用二进制用13的二进制1101代表:1号做完,3号做完,4号做完作业。

这样的我们就叫做,状态压缩

第二、其实第一很好理解的,但是难点就是状态的转化,后来还是很简单,判断一下就好了,任何超出的时间代表扣的分数,每次用中间值temp=前面的扣分+当前扣分,如果这种状态访问过了,比较当前扣分,取小

第三、也是最不熟悉的,位运算,一个是按位或,一个状态下,如果该状态没有该作业,用cur | j 加进去。所以还有就是按位异或,

采用异或运算,相同的就会消去,留下的值的二进制就是某个作业的二进制

#include<iostream>
#include<cstdio>
#include<math.h>
#include<queue>
#include<map>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define PI acos(-1.0) const int N=1<<16;
struct asd{
int cost;
int pre; //记录前一状态,记录路径。
int reduce;
}dp[N];
bool vis[N];
struct cd{
int die;
int cost;
char name[150];
}cou[19]; void outt(int x)
{
int curjob=dp[x].pre^x; //采用异或运算,相同的就会消去,留下的值的二进制就是某个作业的二进制
int curid=0;
curjob>>=1;
while(curjob) //右移,得出第几个作业。
{
curid++;
curjob>>=1;
}
if(dp[x].pre!=0)
{
outt(dp[x].pre);
}
printf("%s\n",cou[curid].name);
} int main()
{
int n,i,j;
int t;
cin>>t;
while(t--)
{
scanf("%d",&n);
int upp=1<<n;
int dayup=0;
for(int i=0;i<n;i++){
scanf("%s%d%d",cou[i].name,&cou[i].die,&cou[i].cost);
dayup+=cou[i].cost;
}
memset(vis,0,sizeof(vis));
dp[0].cost=0;
dp[0].pre=-1;
dp[0].reduce=0;
vis[0]=1;
int work;
int tup=upp-1;
for(j=0;j<tup;j++){
for(work=0;work<n;work++){ //从第一份工作开始
int cur=1<<work;
if((cur&j)==0){ //该项工作尚未做过。
int curtemp=cur|j; //加进去。
int day=dp[j].cost+cou[work].cost; //总花费
dp[curtemp].cost=day;
int reduce=day-cou[work].die; //超出预期时间的reduce。
if(reduce<0)
reduce=0;
reduce+=dp[j].reduce;
if(vis[curtemp]){
if(reduce<dp[curtemp].reduce){
dp[curtemp].pre=j;
dp[curtemp].reduce=reduce;
}
else if(reduce==dp[curtemp].reduce){ //但是这里输入本来就是按照字典序,所以不判断也没事。
if(dp[curtemp].pre>j){
dp[curtemp].pre=j;
}
}
}
else{
vis[curtemp]=1;
dp[curtemp].pre=j;
dp[curtemp].reduce=reduce;
}
}
}
}
printf("%d\n",dp[tup].reduce);
outt(tup);
}
return 0;
}

hdoj1074【A的无比爆炸】的更多相关文章

  1. noip2017爆炸记——题解&总结&反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  2. Good Bye 2016 //智商再次下线,边界爆炸.....

    A B很水就略了.. C.又是一次wannafly一样的判断区间的.....  边界设为2000000  正好GG...... fst的时候立马想到上次也是这么wa过的...... 所以下次遇到这种题 ...

  3. Codeforces Round #384 (Div. 2) //复习状压... 罚时爆炸 BOOM _DONE

    不想欠题了..... 多打打CF才知道自己智商不足啊... A. Vladik and flights 给你一个01串  相同之间随便飞 没有费用 不同的飞需要费用为  abs i-j 真是题意杀啊, ...

  4. 自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药

    自制Unity小游戏TankHero-2D(5)声音+爆炸+场景切换+武器弹药 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm ...

  5. Atitit 游戏引擎---物理系统(1)------爆炸效果

    Atitit 游戏引擎---物理系统(1)------爆炸效果 1.1. 动画框架的来源flex,jqueryuijs,anim , cocos2d 1 1.2. Jqueryui的特效库 1 1.3 ...

  6. [读码]HTML5像素文字爆炸重组

    [边读码,边学习,技术也好,思路也罢] [一款基于HTML5技术的文字像素爆炸重组动画特效,我们可以在输入框中指定任意文字,点击确定按钮后,就会将原先的文字爆炸散去,新的文字以像素点的形式组合起来,看 ...

  7. 《2016ThoughtWorks技术雷达峰会----js爆炸下的技术选型》

    JS爆炸下的技术选型  刘尚奇    ThoughtWorks, 高级咨询师 JS每6个星期出现一个新框架,那么如何进行JS的选型.以下从四个方面来分析. 1.工具 NPM for all the t ...

  8. 【转】15个无比华丽的HTML5/CSS3动画应用

    原文转自:http://www.html5cn.org/article-7089-1.html 前几天,HTML5标准已经尘埃落定,未来的Web将会是由HTML5主导,当然作为开发者对这一喜讯更为动心 ...

  9. css3爆炸效果更换图片轮播图

    思路:给一个div设置一个背景图片1.jpg,然后在这个div上面用两个for循环动态的创建一个列数为C行数为R数量的span,并给这些span设置宽高.定位并设置背景图片0.jpg,然后设置每个sp ...

随机推荐

  1. weex 项目开发(二) weex 与 weexpack 的区别

    1.weex 与 weexpack 即  weex-toolkit 与 weexpack 的区别 weex-toolkit 初始化的项目是针对开发单个 Weex 页面而设计的,也就是说这样的项目只包括 ...

  2. 怎样求结构体成员的偏移地址 || 结构体的 sizeof 总结

    C 语言中同意将值为 0 的变量强制转换成任一类型的指针,转换结果是一个NULL指针. (type*)0 // 一个 type 类型的NULL指针 用这个指针訪问结构体内的成员是非法的,可是 & ...

  3. python实现的一个简单的网页爬虫

    学习了下python,看了一个简单的网页爬虫:http://www.cnblogs.com/fnng/p/3576154.html 自己实现了一个简单的网页爬虫,获取豆瓣的最新电影信息. 爬虫主要是获 ...

  4. 【转载】分布式RPC框架性能大比拼

    dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...

  5. Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)

    一.概述: Yarn调度器有很多实现,如Fifo, Capacity和Fair schedulers等.与其同一时候,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每一个调度器都有自己 ...

  6. DataFactory 5.6注册码

    一.DataFactory 5.6注册码 数据工厂5.6注册码如下,希望能帮助需求之人 AuthKey: 0-87093-23830-05141-17507 SiteMsg: FREELAND EVO ...

  7. Android 代码写控件

    1.设置dialog弹出anthor public static SearchDialog getSearchDialog(Context context,OnDismissListener list ...

  8. android控件之间事件传递

    public boolean dispatchTouchEvent(MotionEvent ev){} 用于事件的分发.Android中全部的事件都必须经过这种方法的分发.然后决定是自身消费当前事件还 ...

  9. Statelessness Provide credentials with the request. Each request MUST stand alone and should not be affected from previous conversation happened from same client in past.

    The server never relies on information from previous requests. Statelessness As per the REST (REpres ...

  10. DDD领域建模基本流程

    整理一个精简的DDD领域建模基本流程,供大家在DDD领域建模实践中进行参考. 搜集用户故事(用户的原始需求) 整理用户故事,抽出用例(用例表达了用户对系统的需求,定义了系统的边界以及系统外部角色和系统 ...