比赛 match

Description

有 N 支队伍打比赛。已知有如下条件:

• 每支队伍恰好打了 4 场比赛

• 对于一场比赛,如果是平局,双方各得 1 分;否则胜者得 3 分,负者不得分

给定每支队伍的初始分数(这时候还没有发生任何比赛)。问编号为 1 的队伍在最优情况下的名次是多 少。

Input

输入的第一行有一个整数 N (5 ≤ N ≤ 50) 。

接下来一行 N 个整数,依次描述编号为 1 ∼ N 的队伍的初始分数。

Output

输出一行一个整数,描述最优情况下,编号为 1 的队伍的名次。

Sample Input

50

0 4 1 10 4 9 3 2 9 5 2 3 1 9 3 10 4 7 2 1 8 9 4 9 1 2 9 6 9 3 8 6 1 5 7 1 3 5 6 8 1 8 9 2 10 5 3 5 2 2

Sample Output

1

解析

这道题目盯着题解看了半个多小时硬是没看懂,所以决定自己写一篇...

这道题可以考虑搜索,

设当前状态为(\(x\),\(w\),\(l\),\(d\)),

其中\(x\)表示当前是第几队,

\(w\)表示(1~\(x\)-1)中的队与( \(x\)~\(n\))中的队比赛赢了\(w\)场,\(l\),\(s\)也一样。

那么,考虑状态转移,

在每个阶段,考虑当前的队与前面的队(即1~\(x\)-1)的比赛情况和与后面的队的比赛情况

开六重循环,逐个枚举\(x\)队赢的场数\(i\),输的场数\(j\),平的场数\(k\),

以及与前面的队比赛的赢的场数\(ni\),输的场数\(nj\),平的场数\(nk\)。

那么,在转移(即搜索到\(x\)+1队)时,

w就应该加上\(i-ni\)(因为赢了(减掉\(ni\)是因为这是对于前面的队(1~\(x\)-1)的影响,而不是对后面的)),

再减去\(nj\)(因为和前面扯平了(别忘了\(w\)的含义,我们已经到了第\(x\)+1层)),

\(l\),\(d\)也同理。

而当\(x\)=\(n\)+1时,如果\(w\),\(l\),\(d\)都等于0,即当前状态可行,就返回0,

并且设\(f[x][opt][min][max][d]\)表示递归到\(x\)队,

如果\(opt\)=1,则\(min\)表示\(w\),\(max\)表示\(l\),如果\(opt\)=0,就相反。(可以省空间,当然四维数组也可以)

\(d\)就表示平局的次数。

那么在枚举的时候更新就行了。

另外,还有一个剪枝,

当\(w\)>4且\(l\)>4,或\(d\)>4时,可以直接返回INF,

因为这种情况下,就表示在(1~x-1)中一定存在两个队对( x~n)中的两个队产生了影响,

那么实际上,(1~x-1)中的这两个队的影响就可以相互抵消掉(即让他们两互相比赛) (口胡证明请自行理解下哈)

那么,初始状态就让第一队全部获胜(即(2,4,0,0))就行了!

还有什么不懂的看下代码吧(也可以在评论区里问):

#include<bits/stdc++.h>
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int INF=0x3f3f3f3f;
int n,a[100001];
int f[51][2][5][501][5]; int dfs(int x,int w,int l,int d){
if(x==n+1) return !w&&!l&&!d? 0:INF;
if((w>4&&l>4)||d>4) return INF;
int &ret=f[x][(w<l)][min(w,l)][max(w,l)][d];
if(ret+1) return ret;
ret=INF;
for(int i=0;i<=4;i++)/*x队的胜利次数*/{
for(int j=0;j<=4-i;j++)/*x队的失败次数*/{
int k=4-i-j;//x队的平局次数
for(int ni=0;ni<=min(l,i);ni++)/*x队与1~(x-1)队中比赛获胜的次数*/
for(int nj=0;nj<=min(w,j);nj++)/*x队与1~(x-1)队中比赛失败的次数*/
for(int nk=0;nk<=min(k,d);nk++)/*x队与1~(x-1)队中比赛平局的次数*/
ret=min(ret,dfs(x+1,w-ni+i-nj,l-nj+j-ni,d-nk+k-nk)+(a[x]+3*i+k>a[1]));
}
}
return ret;
} int main(){
memset(f,-1,sizeof(f));
n=read();
for(int i=1;i<=n;i++) a[i]=read();
a[1]+=12;
printf("%d\n",dfs(2,4,0,0)+1);
return 0;
}

题解 比赛 match的更多相关文章

  1. 题解-比赛CF1332

    题解-比赛CF1332 比赛CF1332 [A] [B] [C] [D] [E] [F] [G] [A]Exercising Walk Exercising Walk \(T\) 组测试数据,每次给定 ...

  2. AtCoder Grand Contest 031题解

    题面 传送门 题解 比赛的之后做完\(AB\)就开始发呆了--简直菜的一笔啊-- \(A - Colorful\ Subsequence\) 如果第\(i\)个字母选,那么它前面任意一个别的字母的选择 ...

  3. poj2699

    神题目=神题解+神读入 题意:n个人比赛, 两两比,共n*(n-1), 赢得1分, n<=10(这给了我们枚举的暗示),如果一个人打败了所有比自己分数高的人, 或者他本身就是分数最高的, 那么他 ...

  4. upc组队赛4 TV Show Game 【2-SAT】

    TV Show Game 题目描述 Mr. Dajuda, who is famous for a TV show program, occasionally suggests an interest ...

  5. Lesson 8 The best and the worst

    Text Joe Sanders has the most beautiful garden in our town. Nearly everbody enters for 'The Nicest G ...

  6. 从零开始之ecshop基础篇(17)

    目标:基于自定义的mvc框架开发的案例(项目) 项目周期    需求分析 典型的业务逻辑:    电子商务:商城(京东),B2C,C2C(淘宝),团购,秒杀,代购 内容管理:新浪门户类,优酷视频管理, ...

  7. 领域驱动设计(DDD:Domain-Driven Design) 介绍

    Eric Evans的“Domain-Driven Design领域驱动设计”简称DDD,Evans DDD是一套综合软件系统分析和设计的面向对象建模方法,本站Jdon.com是国内公开最早讨论DDD ...

  8. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (贪心或有源汇上下界网络流)

    "Oh, There is a bipartite graph.""Make it Fantastic."X wants to check whether a ...

  9. hdu 5616

    Jam's balance Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

随机推荐

  1. python调用hanlp进行命名实体识别

    本文分享自 6丁一的猫 的博客,主要是python调用hanlp进行命名实体识别的方法介绍.以下为分享的全文. 1.python与jdk版本位数一致 2.pip install jpype1(pyth ...

  2. java集合List解析

    作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...

  3. MySQL_bigint(20) 是什么意思?

    MySQL_bigint(20) 是什么意思? MySQL的整型类型有这样几种:   类型 存储空间 M默认值(显示宽度) 数据大小(无符号:unsigned) 描述 1 tinyint(M) 1 t ...

  4. SQLite基础-6.运算符

    目录 SQLite 运算符 1. 运算符 2. 算数运算符 3. 比较运算符 4. 逻辑运算符 SQLite 运算符 1. 运算符 首先,问大家运算符是什么?运算符在很多领域均用使用.它也分很多中,常 ...

  5. #undef取消宏定义

    如果你想定义这个宏那就#define X 如果你不想让你已经#define X的宏在其他地方由于引入这个包含宏定义的.h文件而引起一些编译问题,那你就#undef X掉,就这么简单. 举个简单的例子: ...

  6. NOIP模拟赛 打铁的匠 题解

    [问题描述] Mark Douglas是一名优秀的锻造师.与他优秀的锻造水平不相符,他非常穷,以至于很多好刀都因为缺少素材缺少资金无法打造. Mark把他有能力锻造的所有n种刀建成了一棵锻造树,除了第 ...

  7. Python—None

    None是一个特殊的常量. None不是False. None不是0. None不是空字符串. None有自己的数据类型NoneType,并且是NoneType中唯一的值. None只是一个空值的对象 ...

  8. Elasticsearch5.x安装及常见错误的解决方法

    Elasticsearch是基于java开发的,机器上必须要先java环境,elasticsearch5.x建议用jdk8的最新版本.下面介绍elasticsearch5.x的安装步骤: 一.安装El ...

  9. day05-06

    day05 上传下载 下载工具软件: lrzsz 安装方法: yum install lrzsz -y 下载命令就是sz 上传命令就是rz 下载到widow实列 sz 文件名 上传到linux 执行r ...

  10. docker CMD 和 ENTRYPOINT 区别

    昨天用Dockerfile来启动mongodb的集群,启动参数--replSet死活没执行,最后就决定研究一哈cmd和entrypoint.但是上网看了一些资料个人觉得讲的不好,还是没有说出根本的东西 ...