Pro

Luogu3087

Sol

哇哇哇,昨晚调了一个小时没调出来,今天早上调了一会就出来了坑点不算很多,只是我比较粗心……

拿到题,一眼肯定想到和排列组合有关的知识,其实用到的也不是太多,首先对于单词的存储,我们想方设法的把每一行和每一列的单词都分别存下来,以后都会调用到的。然后预处理出第iii列第j" role="presentation" style="position: relative;">jjj行后面有多少种可能性放到qcqcqc数组中,递推公式:

qci,j=qci+1,j×cnt[i+1]qci,j=qci+1,j×cnt[i+1]

qc_{i,j} = qc_{i+1,j} × cnt[i+1]

在预处理之前呢,我们求出每一列不同的单词数量,存到cntcntcnt数组中,可以排好序之后用类似栈的做法做,不多解释了,截止到现在,排列组合的知识已经全部用完~

然后,我们求如果没有删除(在所有的牛中去掉没有的牛)操作,我们要查询的KKK所对应的位置。什么叫对应的位置呢?就是开始我们的状压了:对于每一列,每一个单词都标记一下,该单词是这一列的第几个单词。那么我们第一次求K" role="presentation" style="position: relative;">KKK的位置的时候,就能把求得的这些位置存到KnumKnumKnum数组中。

接下来就是删除操作,所谓删除,其实我们可以理解为:如果有比KKK的位置小的数,我们就把K" role="presentation" style="position: relative;">KKK往后移。应该很容易理解吧。于是我们就枚举每一行,把每一行的几个单词对应的位置处理出来,存到PnumPnumPnum数组中,用solsolsol函数进行比较,如果比KKK的位置要小,K" role="presentation" style="position: relative;">KKK就后移。最后KnumKnumKnum中的数就是我们答案在他所在列的位置,输出就好了。

再说说把单词转化为位置的做法,刚才我们维护了第iii行第j" role="presentation" style="position: relative;">jjj列后面的可能性。我们每一列每一列的求,对于每一列,枚举他的每一行,如果从枚举到的这一行向上,所有可能性的总和比我们要查的位置要大,我们就取这一行,更新我们要查的位置,更新的时候一定要记得乘上行数减一!

几个易错的地方:

1.最后比较每一行与KKK所对应的位置的时候,一位一位的比较,发现小的,立即停止,注意,不是break" role="presentation" style="position: relative;">breakbreakbreak,是returnreturnreturn,因为题目中可能会有比较的两个字符串每一个位置对应相等的情况,因此在最后打上标记就行。

2.把每一个单词转化为每一列的第几个单词的时候,注意两个地方,第一个就是相等的情况,如果相等,后面的直接取最后一行;第二种是最后一列的时候,直接就可以赋值。

Code

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;struct Letr {int group;string adj;bool operator < (const Letr &a) const {return adj < a.adj;}
};
Letr adj[30005];
vector<string>str[350];
int n , k , num , top = 0 , cnt[350] , qc[350][1050], knum[350] , pnum[350], flag;
string gro[350][1050];int jud(string s) {if(s != "Farmer" && s != "John" && s != "has" && s != "no" && s != "cow.")return 1;return 0;
}void update(int t) {for(int i=1; i<num; i++) {int sum = 0;for(int j=1; j<=cnt[i]; j++) {sum += qc[i][j];if(sum == t) {knum[i] = j;for(int l=i+1; l<=num; l++)knum[l] = cnt[i];return ;}if(sum > t) {knum[i] = (j-1<1)?1:j;t -= (qc[i][(j-1<1)?1:(j-1)]*(j-1));break;      }}}knum[num] = t;
} void sol(int x[] , int y[]) {for(int i=1; i<=num; i++) {if(x[i] > y[i])return;if(x[i] < y[i]) {flag = 1;return;     }}flag = 1;
}int main() {scanf("%d%d",&n,&k);for(int i=1; i<=n; i++) {string s;num = 0;while(1) {cin>>s;if(jud(s)) {num++;str[i].push_back(s);adj[++top].adj = s;adj[top].group = num;}if(s == "cow.")break;}}sort(adj , adj+top+1);for(int i=1; i<=top; i++) {if(adj[i].adj == adj[i-1].adj && adj[i].group == adj[i-1].group)continue;gro[adj[i].group][++cnt[adj[i].group]] = adj[i].adj;}for(int i=1; i<=n; i++)qc[num][i] = 1;for(int i=num-1; i>=1; i--)for(int j=1; j<=n; j++)qc[i][j] = qc[i+1][j]*cnt[i+1];update(k);for(int i=1; i<=n; i++) {flag = 0;for(int j=0; j<str[i].size(); j++) {for(int l=1; l<=cnt[j+1]; l++) {if(str[i][j] == gro[j+1][l]) {pnum[j+1] = l;break;}}       }sol(pnum , knum);if(flag) {k++;update(k);}}for(int i=1; i<=num; i++)cout<<gro[i][knum[i]]<<" ";return 0;
}

[USACO13NOV]Farmer John has no Large Brown Cow【状压 / 模拟】相关推荐

  1. 2190: 【USACO】Farmer John has no Large Brown Cow

    2190: [USACO]Farmer John has no Large Brown Cow 时间限制: 1.000 Sec  内存限制: 64 MB 提交: 16  解决: 12 [命题人:][下 ...

  2. 2021.8.14【提高B组模拟6】T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)

    United Cows of Farmer John 题目传送门 解题思路 树状数组乱糊 AC代码 #include<cstdio> #include<cstring> usi ...

  3. 安慰奶牛 问题描述 Farmer John变得非常懒,他不想再继续维

    package ALGO;/*安慰奶牛 时间限制:1.0s 内存限制:256.0MB问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续 ...

  4. Farmer John 木瓜地 C++

    Bessie不小心游荡出Farmer John的田地,而走进了相邻的农民的地.她举起一个木瓜,木瓜对奶牛来说可是不可多得得美味.这个木瓜林像一般的威斯康星州的田地一样被分割成一个 R行C列的网格(1 ...

  5. Farmer John的故事

    从前有个农民,名字叫约翰,于是大家叫他Farmer John(FJ).FJ养了很多奶牛,这些奶牛很聪明,它们很喜欢看自然科学和数学书,但是它们对书的ISBN码感到奇怪,于是就有了ISBN问题.渐渐的, ...

  6. Farmer John的故事——写给程序员们

    Farmer John的故事: 从前有个农民,名字叫约翰,于是大家叫他Farmer John(FJ).FJ养了很多奶牛,这些奶牛很聪明,它们很喜欢看自然科学和数学书,但是它们对书的ISBN码感到奇怪, ...

  7. Farmer John's math(c++)

    在CUGB队员驱车南下比赛的途中,突然发现没口粮了--饿得头晕眼花. 恰好迎面走来个人,原来是Farmer John,众所周知,FJ(Farmer John)喜欢数学,可是大家有所不知,他除了养牛,还 ...

  8. soj2093: Farmer John

    soj上的一题,自己没想清楚就做结果坑了好久,先上题目 Problem D: Farmer John If you once took part in USACO, which is short fo ...

  9. 迷路的奶牛 Farmer John C++

    描述 Farmer John的N头奶牛,总是会迷路走到农场上遥远的地方去!他需要你帮助将她们一起赶回来. 农场的草地大体是一块狭长的区域--我们可以将其想象成一条数轴,奶牛可以占据数轴上的任意整数位置 ...

最新文章

  1. phpcms v9二次开发之模型类的应用(1)
  2. oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析
  3. Flink专题-BaseTransform
  4. C#EF中,使用类似于SQL中的% 模糊查询
  5. (模板)网页游戏用的“内容区”的“图赏影音”模板
  6. Linux makefile 教程 很具体,且易懂
  7. PHP中0、空、null和false的总结
  8. SQL中到底要不要用WHERE 1=1
  9. 字节跳动1/3员工不支持取消大小周!库克称iPhone将采用可回收材料生产;清华博士接亲被要求现场写代码|极客头条...
  10. 西门子g120c面板参数设定_西门子PCS7模拟量单位设置
  11. andriod stdio 如何通过按钮保存textview的内容到txt文件中_信不信由你|手把手教你制作视频中的逐行显示字幕,超实用啊!...
  12. pc 页面在移动端怎么获取放大倍数、_逆冬:移动端排名应该怎么做?两种匹配移动端实战排名干货分享!...
  13. 平面设计ps/ai/cdr
  14. ping测试告警软件,SmartPing:一个服务器Ping值监测工具,带报警功能
  15. kangle安装php7.0_搭建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
  16. 爱剪辑如何解决分段视频在串接处快两秒的问题
  17. PHP自学---黑马程序员笔记【持续更新】
  18. win10安装—手记
  19. 计算机太卡了怎么解决,电脑太卡怎么办最有效
  20. 员工每月工资数据集可视化分析

热门文章

  1. struct 和typedef struct的区别
  2. HTML的语义化和一些简单优化
  3. window对象与document对象的区别
  4. 关于.NET中socket中的异步套接字的研究二
  5. 【跃迁之路】【468天】程序员高效学习方法论探索系列(实验阶段225-2018.05.19)...
  6. Eclipse Photon即将发布
  7. 【转】Mac下升级python2.7到python3.6
  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
  9. Lua环境配置和工具介绍
  10. 4 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之Lvs为Mysql-slave做负载均衡