首页 > 其他分享 >P9184 [USACO23OPEN] Moo Language B 题解

P9184 [USACO23OPEN] Moo Language B 题解

时间:2024-03-02 17:24:48浏览次数:39  
标签:语句 USACO23OPEN P9184 题解 back 及物 && push size

恶♂趣♂味♂大♂模♂拟♂。

首先是构造语句部分:

  • 开始肯定是尽可能地多用上不及物语句和及物语句;

  • 接着,因为及物语句的单词数量一定比不及物语句多,所以贪心地尽可能多地将不及物语句改为及物语句;

  • 然后,为了增加语句长度,再次贪心地在及物语句中尽可能多地添加名词和逗号即可。

接下来是输出部分:

  • 对于一个语句中的单词,若其编号 \(\ge 1\),则需要输出空格;若其编号 \(\ge 3\),则需要输出逗号;

  • 对于不是最后一句的语句,若它还能够与其他语句通过连词相连,则使用一个连词。

代码:

void solve(){
	//读入与初始化
	cin>>n>>c>>p,sum=tot=ttot=0;
	for(int i=0;i<4;i++) a[i].clear();
	for(int i=1;i<=n;i++){
		string s,op; cin>>s>>op;
		if(op[0]=='n') a[0].push_back(s);
		else if(op[0]=='t') a[1].push_back(s);
		else if(op[0]=='i') a[2].push_back(s);
		else a[3].push_back(s);
	}
	
	p+=min(p,(int)(a[3].size())); //计算语句总数
	for(;a[0].size()&&a[2].size()&&tot<p;sum+=2){ //使用不及物语句
		ans[++tot]=a[4];
		ans[tot].push_back(a[0].back()),ans[tot].push_back(a[2].back());
		a[0].pop_back(),a[2].pop_back();
	}
	for(ttot=tot;a[0].size()>=2&&a[1].size()&&tot<p;sum+=3){ //使用及物语句
		ans[++tot]=a[4];
		ans[tot].push_back(a[0].back()),ans[tot].push_back(a[1].back());
		a[0].pop_back(),a[1].pop_back();
		ans[tot].push_back(a[0].back());
		a[0].pop_back();
	}
	for(;ttot&&a[0].size()&&a[1].size();ttot--,sum++){  //尽量用及物语句替代不及物语句
		ans[ttot].pop_back();
		ans[ttot].push_back(a[1].back()),ans[ttot].push_back(a[0].back());
		a[0].pop_back(),a[1].pop_back();
	}
	for(;ttot!=tot&&a[0].size()&&c;c--,sum++) //添加名词和逗号
		ans[tot].push_back(a[0].back()),a[0].pop_back();

	cout<<sum+min(tot/2,(int)(a[3].size()))<<'\n'; //输出语句总数
	for(int i=1;i<=tot;i++){
		for(int j=0;j<ans[i].size();j++){
			if(j>2) cout<<',';
			if(j) cout<<' ';
			cout<<ans[i][j];
		}
		if(i<tot){
			if(i%2&&a[3].size()) //若能够使用连词
				cout<<' '<<a[3].back()<<' ',a[3].pop_back();
			else cout<<". ";
		}
	}
	if(sum) cout<<".\n"; //若有答案才输出句号
}

标签:语句,USACO23OPEN,P9184,题解,back,及物,&&,push,size
From: https://www.cnblogs.com/XOF-0-0/p/18048918

相关文章

  • CF1856E1 PermuTree (easy version) 题解
    假定当前在节点\(u\),它拥有两棵子树\(v,w\),此时\(u\)是\(\operatorname{lca}(v,w)\)。我们一定可以构造出一个排列\(a\),使得所有满足\(i\inv\)的节点\(i\)和满足\(j\inw\)的节点\(j\),有\(a_i<a_u<a_j\)。因此此时点\(u\)对于答案的贡献即为\(size_v\times......
  • P9183 [USACO23OPEN] FEB B 题解
    由于只需要考虑相邻的位置,所以每一段连续的F是互不影响的,可以分别进行考虑。而连续的一段F又可以分成两类:靠边的和被夹在中间的。靠边的F段较为简单,假定有\(c\)个F,不难发现只要让EB交错出现就可以达到最少次数,而让所有的F都变成最近的非F就可以达到最多次数\(c......
  • P3671 [USACO17OPEN] Where's Bessie? S 题解
    我们先枚举所有子矩阵,验证其在不考虑重叠的情况下是否为PCL矩阵(dfs求一遍联通块即可)。然后将所有满足条件的矩阵存下来,最后朴素判断每个矩阵是否被其他矩阵包括,若没有矩阵包括它,则其对于答案的贡献为\(1\),累加所有贡献即为最终结果。时间复杂度是\(O(n^6)\)的。思路很简......
  • P1874 快速求和 题解
    updon2023/12/22:修改了代码,现已通过所有hack数据。首先定义状态:令\(dp_{i,j}\)表示前\(i\)个数字要变成\(j\)所需要的最少加号个数。同时,我们还需要一个辅助数组:令\(num_{i,j}\)表示\(i\simj\)的数字组成的数(不添加加号)。然后进行转移。显然可以枚举......
  • AT_dp_z Frog 3 题解
    这题的朴素dp是显然的。令\(dp_i\)表示跳到第\(i\)个石头的最小花费,有转移方程:\[dp_i=\min_{j=1}^{i-1}\{dp_j+(h_i-h_j)^2+C\}\]直接转移是\(O(n^2)\)的,考虑优化。首先对于\(\min\)以内的式子化简,得:\[dp_j+h_i^2+h_j^2-2h_ih_j+C\]将与\(j\)无关的项剔除,得:\[d......
  • 喵了个喵 题解
    传送门这玩意是T2???观察到\(k=2n-2\)或\(k=2n-1\),所以我们可以尝试让每个栈里面都保持两张牌。同时保留一个空栈,用来消栈底。记这个保留的空栈为\(sp\)。策略1:如果当前牌堆顶的牌能消,必然消;否则除了\(sp\),如果存在一个没有填到两张牌的栈,放进去。当\(k=2n-1\)......
  • CF1915D Unnatural Language Processing 题解
    容易发现音节的划分不仅要求子串形如\(\texttt{CV}\)或\(\texttt{CVC}\),并且接下来的两个字符也必须是\(\texttt{CV}\),不然会导致无法划分下去。于是我们遍历字符串,找出所有满足上述条件的子串,记录需要输出\(\texttt{.}\)的位置即可。实现:intn;strings,ans,t="";cin>......
  • CF1915E Romantic Glasses 题解
    我们考虑维护\(sum_i\)表示前\(i\)个数中偶数下标的数之和与奇数下标的数之和之差,其中\(sum_0=0\)。若在某一时刻,有\(sum_i=sum_j(j<i)\),说明\(j\simi\)中偶数下标的数之和与奇数下标的数之和之差为\(0\)。这个使用map判断即可。实现:intn,f=0;cin>>n;m.clear()......
  • CF1921D Very Different Array 题解
    补充一个对本题贪心思路更(?)清楚的解释。本题贪心思路:在\(a_i,b_i\)分别升序的情况下,对于每个\(a_i\),与它差值最大的\(b_i\)只可能出现在\(b_{n-i+1}\)与\(b_{m-i+1}\)这两者中。证明:首先,假设我们有一个长度为\(n\)的升序序列\(s\)。则对于\(s_1\),与它差值最大......
  • CF10E 题解
    传送门有\(n\)种货币。找一个最小的金额\(x\),使得贪心法付款不是最优解;如果贪心法始终都是最优解,输出\(-1\)。\((n\le400)\)将货币集合记作一个\(n\)维向量\(C=(c_1,c_2,\dots,c_n)\)。对于金额\(x\)的一个表示法,也记作一个\(n\)维向量\(V\)。即\(C\timesV=x\)。......