NYIST 1108 最低的惩罚

最低的惩罚

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述

那么现在问题就来了。。。

给你N(1=<N<=15)个任务,每个任务有一个截止完成时间t(1=<t<=10^8)和完成该任务需要的天数v(1=<v<=10^8),任务每超时一天惩罚加1,问最少能获得多少惩罚?

输入
第一行一个数T,表示测试数据组数(T<2000);
对于每组测试数据,第一行一个数N,表示任务个数;
紧接着N行,每行两个数t和v,如上所述。
输出
对于每组测试数据,输出最小惩罚。
样例输入
2
3
3 3
20 1
3 2
3
3 3
6 3
6 3 
样例输出
2
3
上传者
TC_赵坤垚
解题:状压dp,老王说的,确实是的

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <climits>
 7 #include <vector>
 8 #include <queue>
 9 #include <cstdlib>
10 #include <string>
11 #include <set>
12 #include <stack>
13 #define LL long long
14 #define pii pair<int,int>
15 #define INF 0x3f3f3f3f
16 using namespace std;
17 const int maxn = 16;
18 int n,dp[1<<maxn],cnt[1<<maxn],td[maxn],tm[maxn];
19 int main() {
20     int T;
21     scanf("%d",&T);
22     while(T--){
23         scanf("%d",&n);
24         int u = 1<<n;
25         for(int i = 0; i < n; ++i)
26             scanf("%d %d",td+i,tm+i);
27         memset(dp,0x3f,sizeof(dp));
28         for(int i = 0; i < n; ++i)
29             dp[1<<i] = tm[i] > td[i]?tm[i] - td[i]:0;
30         for(int i = 1; i < u; ++i){
31             cnt[i] = 0;
32             for(int k = 0; k < n; ++k)
33                 if(i&(1<<k)) cnt[i] += tm[k];
34         }
35         for(int i = 1; i < u; ++i){
36             for(int k = 0; k < n; ++k){
37                 if(i&(1<<k)) continue;
38                 int tmp = cnt[i] + tm[k] - td[k];
39                 if(tmp > 0) dp[i^(1<<k)] = min(dp[i^(1<<k)],dp[i] + tmp);
40                 else dp[i^(1<<k)] = min(dp[i^(1<<k)],dp[i]);
41             }
42         }
43         printf("%d\n",dp[u-1]);
44     }
45     return 0;
46 }

时间: 2024-12-21 05:30:34

NYIST 1108 最低的惩罚的相关文章

最大概率法分词中词频惩罚因子的作用探究

在最大概率法分词的程序中,由于每个词出现的次数分布非常不均匀,而且我们要计算每个词出现的概率,对于出现次数比较少的词概率就很小,求句子中词的概率之积的时候,需要将好多非常小的数作乘法,可能会将超出计算机所能表示的数的最小范围.为了便于计算,常常要将每个词的概率求对数后在进行计算,但是由于对概率求对数后变为负值,因此要求对应的相反数.所以一个词出现的次数越多,最后求得对应的值越小,我们将这个值称为这个单词的代价.单词出现的次数越多,该单词的代价越低:否则代价越高. 第一部分 公式推导 假设:单词S

最低点差(欧美最低1个点差),支持ECN账户

最低点差(欧美最低1个点差),支持ECN账户Welcome账户开户成功就送8美元. 让你0投入开始外汇实盘之路.更重要的一点是,开户完全在网上搞定,在网上填写申请表,提供国内身份证明和地址证明的扫描件,很快就搞定了. 特点:1.点差低,欧美EURUSD点差只要1到2个点差.2.可通过工商或建设网银0手续费入金,入金金额不限制,可以是5美元,也可以50美元,没有其他外汇公司的电汇就100多美元的手续费.也没有最低入金200美元这样的限制 3.可以交易迷你单,最低可以下0.01手.4.杠杆最大1:5

Relation Extraction中SVM分类样例unbalance data问题解决 -松弛变量与惩罚因子

转载自:http://blog.csdn.net/yangliuy/article/details/8152390 1.问题描述 做关系抽取就是要从产品评论中抽取出描述产品特征项的target短语以及修饰该target的opinion短语,在opinion mining里面属于很重要的task,很多DM.NLP相关的paper在做这方面的工作.基本的思路是: (1)从sentence的parse tree(比如stanford parser)中选取候选target结点和候选opinion结点,然

别拿学历说事,这些天王中学没毕业,最低的是成龙

别拿学历说事,这些天王中学没毕业,最低的是成龙 不八卦会死星人 01月30日 12:28 分类 :娱乐 阅读:3127 别拿学历说事,刘德华梁朝伟中学没毕业,最低的是成龙 俗话说:知识改变命运,但这里的知识指的并不是学历,娱乐圈就不乏学历低,但各方面都颇有建树的艺人 英雄莫问出处,今天小8就给大家开扒一下那些明星鲜为人知的学历 首先是天王刘德华,香港可立高中毕业 他的父亲是机场消防员,家里六个小孩,生活并不富裕,于是高中毕业后他就报考了无线第十期艺员训练班,那时每个培训班的学员还能拿到一定补助,

《哈利波特》购书最低折扣

·书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示: 本数                  折扣 2                       5% 3                       10% 4                       20% 5                       25% ·根据购买的卷数以及本数,会对应不同折扣规则情况.单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本

win10系统安装oracle11g时遇到INS-13001环境不满足最低要求

升级win10系统之后,需要重新安装Oracle,因为在安装Oralce11g时,使用64位的会出现各种不兼容问题,我每次安装都是使用32位的数据库. 在安装时点击setup.exe之后,出现了:[INS-13001]环境不满足最低要求 这时,打开你的解压后的database文件夹,找到state,然后cvu,找到cvu_prereq.xml文件,用记事本打开,增添一下内容 <OPERATING_SYSTEM RELEASE="6.2">           <VER

评委打分问题---去掉两个最高分,两个最低分,求平均分

//评委打分 去掉两个最高分 去掉两个最低分 求平均数 int []defen={78,79,80,83,89,99,90,76,88,98}; for(int a=0;a<defen.length;a++) { System.out.print(defen[a]+"\t"); } System.out.println();//第一步,初始化 for(int b=1;b<defen.length-1;b++) { for(int a=0;a<defen.length-

NYIST 914Yougth的最大化【二分搜索/Dinkelbach算法】

转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187637.html 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=914 问题描述:有N个物体,它们的利益用v[i]表示,代价用c[i]表示.现在要在这N个物体中选取K个物体,使得选出来的这K个物体的总利益除以总代价达到最大值.即取得最大值. 问题转化:构造一个x[N]的数组,表示每个数取或不取的状态,显然每一个x[i]只有两个取值:

二叉树两个结点的最低共同父节点

后序遍历就行. //寻找二叉树两个结点的最低共同父节点 TreeNode *FindFirstCommonParentNode(TreeNode *pRoot, TreeNode *pNodeOne, TreeNode *pNodeTwo) { if (NULL == pRoot) { return NULL; } if (pRoot == pNodeOne || pRoot == pNodeTwo) { return pRoot; } TreeNode *pLeft = FindFirstCo