[USACO13NOV]Farmer John has no Large Brown Cow【状压 / 模拟】
Pro
Luogu3087
Sol
哇哇哇,昨晚调了一个小时没调出来,今天早上调了一会就出来了坑点不算很多,只是我比较粗心……
拿到题,一眼肯定想到和排列组合有关的知识,其实用到的也不是太多,首先对于单词的存储,我们想方设法的把每一行和每一列的单词都分别存下来,以后都会调用到的。然后预处理出第iii列第j" role="presentation" style="position: relative;">jjj行后面有多少种可能性放到qcqcqc数组中,递推公式:
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【状压 / 模拟】相关推荐
- 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 [命题人:][下 ...
- 2021.8.14【提高B组模拟6】T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)
United Cows of Farmer John 题目传送门 解题思路 树状数组乱糊 AC代码 #include<cstdio> #include<cstring> usi ...
- 安慰奶牛 问题描述 Farmer John变得非常懒,他不想再继续维
package ALGO;/*安慰奶牛 时间限制:1.0s 内存限制:256.0MB问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续 ...
- Farmer John 木瓜地 C++
Bessie不小心游荡出Farmer John的田地,而走进了相邻的农民的地.她举起一个木瓜,木瓜对奶牛来说可是不可多得得美味.这个木瓜林像一般的威斯康星州的田地一样被分割成一个 R行C列的网格(1 ...
- Farmer John的故事
从前有个农民,名字叫约翰,于是大家叫他Farmer John(FJ).FJ养了很多奶牛,这些奶牛很聪明,它们很喜欢看自然科学和数学书,但是它们对书的ISBN码感到奇怪,于是就有了ISBN问题.渐渐的, ...
- Farmer John的故事——写给程序员们
Farmer John的故事: 从前有个农民,名字叫约翰,于是大家叫他Farmer John(FJ).FJ养了很多奶牛,这些奶牛很聪明,它们很喜欢看自然科学和数学书,但是它们对书的ISBN码感到奇怪, ...
- Farmer John's math(c++)
在CUGB队员驱车南下比赛的途中,突然发现没口粮了--饿得头晕眼花. 恰好迎面走来个人,原来是Farmer John,众所周知,FJ(Farmer John)喜欢数学,可是大家有所不知,他除了养牛,还 ...
- soj2093: Farmer John
soj上的一题,自己没想清楚就做结果坑了好久,先上题目 Problem D: Farmer John If you once took part in USACO, which is short fo ...
- 迷路的奶牛 Farmer John C++
描述 Farmer John的N头奶牛,总是会迷路走到农场上遥远的地方去!他需要你帮助将她们一起赶回来. 农场的草地大体是一块狭长的区域--我们可以将其想象成一条数轴,奶牛可以占据数轴上的任意整数位置 ...
最新文章
- phpcms v9二次开发之模型类的应用(1)
- oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析
- Flink专题-BaseTransform
- C#EF中,使用类似于SQL中的% 模糊查询
- (模板)网页游戏用的“内容区”的“图赏影音”模板
- Linux makefile 教程 很具体,且易懂
- PHP中0、空、null和false的总结
- SQL中到底要不要用WHERE 1=1
- 字节跳动1/3员工不支持取消大小周!库克称iPhone将采用可回收材料生产;清华博士接亲被要求现场写代码|极客头条...
- 西门子g120c面板参数设定_西门子PCS7模拟量单位设置
- andriod stdio 如何通过按钮保存textview的内容到txt文件中_信不信由你|手把手教你制作视频中的逐行显示字幕,超实用啊!...
- pc 页面在移动端怎么获取放大倍数、_逆冬:移动端排名应该怎么做?两种匹配移动端实战排名干货分享!...
- 平面设计ps/ai/cdr
- ping测试告警软件,SmartPing:一个服务器Ping值监测工具,带报警功能
- kangle安装php7.0_搭建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
- 爱剪辑如何解决分段视频在串接处快两秒的问题
- PHP自学---黑马程序员笔记【持续更新】
- win10安装—手记
- 计算机太卡了怎么解决,电脑太卡怎么办最有效
- 员工每月工资数据集可视化分析
热门文章
- struct 和typedef struct的区别
- HTML的语义化和一些简单优化
- window对象与document对象的区别
- 关于.NET中socket中的异步套接字的研究二
- 【跃迁之路】【468天】程序员高效学习方法论探索系列(实验阶段225-2018.05.19)...
- Eclipse Photon即将发布
- 【转】Mac下升级python2.7到python3.6
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
- Lua环境配置和工具介绍
- 4 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之Lvs为Mysql-slave做负载均衡