题意:

一场考试。一些题目结果已经出来,对于j题每个人能知道自己是否做对,做对得到points[j]分,做错0分。

令一些结果还未出来的题目,对于j题知道每个人是否提交,提交了就有机会得到points[j]分,否则必然的到0分。

然后对于成绩排在前p的人中(分数相同按照id,id小的排前面),随机选择q个,问方案数。

给这DP跪,完全没思路,然后看了一眼别人的dp状态,yy乱搞,结果就过了,现在整理一下思路。

先得到每个人最多能得的分数ma[i],和最少能得到的分数mi[i],对于我们选择的q个人,我们都假设他们得到最高分,其他都得他们的最低分,这样就不会出现中间情况,总方案数也不会减少。

枚举每一个1~n,假设他是选择的q个人中得分最低的。然后DP

假设现在选择x

状态dp[i][j][k]表示前i人,有j个排名在x前面,选择了k个的方案,转移看代码。

因为每次选择的方案最后一个人都不同,所以枚举x不会出现重复。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <vector>
#define clr(x,y) memset(x,y,sizeof(x))
using namespace std ;
typedef long long ll ;
const double eps = 1e-6 ;const int N = 55;
int mi[N],ma[N];
ll dp[N][N][N];
int n,p,q;class RabbitProgramming
{
public:ll solve(){ll ans = 0;for(int x=1;x<=n;x++){clr(dp,0);dp[0][0][0] = 1;for(int i=1;i<=n;i++){if(i!=x){for(int j=0;j<=n;j++){for(int k=0;k<=n;k++){if(i<x){  //在x的前面的分数比ma[x]小于等于,排名就在他前面了,所以和i>x分开讨论if(mi[i] < ma[x])dp[i][j][k] += dp[i-1][j][k]; //i不加入比x大的行列elseif(j>=1) dp[i][j][k] += dp[i-1][j-1][k];//i必须加入比x大的行列if(ma[i]>=ma[x])if(j>=1&&k>=1) dp[i][j][k] += dp[i-1][j-1][k-1];//i被选择}else{if(mi[i]<=ma[x])dp[i][j][k] += dp[i-1][j][k];elseif(j>=1) dp[i][j][k] += dp[i-1][j-1][k];if(ma[i]>ma[x])if(j>=1&&k>=1) dp[i][j][k] += dp[i-1][j-1][k-1];}}}}else{for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)dp[i][j][k] = dp[i-1][j-1][k-1];//x必须被加入}}for(int i=0;i<=p;i++)ans += dp[n][i][q];//有小于等于p个在它前面的方案都可以加入答案,而且不会出现重复,//因为对于固定了选择q个,有不同个排在前面的选择其中的方案都不会相同。}return ans;}long long getTeams(vector <int> p, vector <string> s, int qu, int se){::n = s.size();::p = qu;::q = se;clr(mi,0);clr(ma,0);for(int i=0;i<(int)p.size();i++){if(p[i]>0){for(int j=0;j<n;j++)if(s[j][i]=='Y')mi[j+1]+=p[i],ma[j+1]+=p[i];}else{for(int j=0;j<n;j++)if(s[j][i]=='Y')ma[j+1] += -p[i];}}return solve();}};// Powered by FileEdit
// Powered by TZTester 1.01 [25-Feb-2003]
// Powered by CodeProcessor

SRM 475 DIV1 900相关推荐

  1. TC SRM 655 Div1 Level 3 题解

    TC SRM 655 Div1 Level 3 题解 题目传送门 dp+几何 首先可以发现凸包是顺时针排列的一些线段构成的.我们可以预处理每一个蓝点是否都在一个线段 r [ i ] → r [ j ] ...

  2. SRM 583 DIV1

    A 裸最短路. 1 class TravelOnMars { 2 public: 3 int minTimes(vector <int>, int, int); 4 }; 5 vector ...

  3. SRM 590 DIV1

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 水水更健康,终于回到1800+了... DIV2 ...

  4. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  5. SRM 563 Div1 500 SpellCards

    Description 有n张符卡排成一个队列,每张符卡有两个属性,等级lili和伤害didi. 你可以做任意次操作,每次操作为以下二者之一: 把队首的符卡移动到队尾. 使用队首的符卡,对敌人造成di ...

  6. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  7. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  8. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  9. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

最新文章

  1. sql 纵向求和_sql列统计求和
  2. PHP内核之PHP_FUNCTION宏定义
  3. Head First C 第八章 静态库与动态库 创建动态库
  4. ConcurrentHashMap的源码分析-treeifyBin
  5. 关于“豪猪”,你理解的透彻吗?【Hystrix是个什么玩意儿】
  6. 操作系统(4) -- 文件管理
  7. [转]Vi/Vim查找替换使用方法
  8. mac查看mysql+utf8_Mac上修改MySQL默认字符集为utf8
  9. c语言做一个抽奖小程序,小程序插件使用- 抽奖助手
  10. iOS 开发常用链接总结
  11. NVIDIA 显卡信息(CUDA信息的查看)
  12. UVa1584 - Circular Sequence
  13. 【链表相加】程序员面试金典——2.5链式A+B
  14. 提升大数据可视化的技巧有哪些
  15. PHP编写时的灵活性
  16. fio性能测试工具新添图形前端gfio
  17. 嵌入式常用通讯协议2(CAN协议)
  18. 中国各省GDP数据集(1949年-2020年)
  19. 如何判断是否是webservice接口
  20. android 新浪微博第三方登录,Android的集成新浪微博第三方登录

热门文章

  1. 关于自己开发财务管理系统的个人总结
  2. 软件的生命周期和测试的生命周期的区分
  3. matlab三个自变量一个因变量拟合
  4. 红米4高配版_标注:2016060_官方线刷包_救砖包_解账户锁
  5. audioread-支持多种解码 (GStreamer + Core Audio + MAD + FFmpeg) 的python音频解码库
  6. 什么是JSON。如何使用JSON。
  7. WaveDrom的使用
  8. 2017第二十八届国际制冷、空调、供暖、通风及食品冷冻加工展览会会刊(参展商名录)
  9. 如何轻松地的现货白银中预测走势?
  10. 利用有穷自动机去除C语言代码行注释(//)以及块注释(/* */)