首页 > 其他分享 >AtCoder ABC047D 题解

AtCoder ABC047D 题解

时间:2023-06-17 16:00:38浏览次数:39  
标签:AtCoder money Min int 题解 ABC047D ans 价格 10

题意理解&分析:

大概的题意应该是十分清晰的,就是一个人要从 \(1\) 到 \(n\) 的城市中买苹果。另一个人要其中调整价格。

这里的调整也不需要太多,就 \(1\) 就可以了。但是,如果有多组购买方案可以得到相同的利润,就还需要将其他相同的价格一并调整。这道题的关键就在于求出有几组购买方案最少。

也就是说,我们需要求出有多少组商店的价格差最大。

拿样例 2 来说:

5 8
50 30 40 10 20

其中 \(30\) 到 \(40\),\(10\) 到 \(20\) 的差价都为 \(10\)。

所以我们需要调整他们两个的价格,所以答案为 \(2\)。

我们可以用 \(Min\) 记录过往商店中最低的价格,用 \(money\) 记录最小利润,用 \(ans\) 记录最少购买方案的组数。\(Min\):中途保持更新为最低价格。\(money\):每次比较利润,有更大时更新,同时将 \(ans\) 赋值为 \(1\)。\(ans\):记录答案。

Min=p[1];
money=-1;
for(int i=2;i<=n;i++)
{
	if(p[i]<Min)
	{
		Min=p[i];
	}
	else
	{
		if(p[i]-Min==money)
		{
			ans++;
		}
		else if(p[i]-Min>money)
		{
			money=p[i]-Min;
			ans=1;
		}
	}
}

最后直接输出 \(ans\) 即可。

AC 代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
//养成好习惯
int n,t;
int p[N];
int Min;
int money;
int ans;
int main()
{
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&p[i]);
	}
    //输入
	Min=p[1];
	money=-1;
	for(int i=2;i<=n;i++)
	{
		if(p[i]<Min)
		{
			Min=p[i];
            //更新Min
		}
		else
		{
			if(p[i]-Min==money)
			{
				ans++;
                //累计答案
			}
			else if(p[i]-Min>money)
			{
				money=p[i]-Min;
				ans=1;
                //更新money并赋值ans
			}
		}
	}
	printf("%d\n",ans);
    //输出结束
	return 0;
}

标签:AtCoder,money,Min,int,题解,ABC047D,ans,价格,10
From: https://www.cnblogs.com/Redefinition/p/17487583.html

相关文章

  • CF1732D1 题解
    CF1732D1Balance题解题目解释输入一个\(op\)和\(x\),\(op\)有\(2\)种情况。\(op\)为+,则将\(x\)加入到集合中。\(op\)为?,则找到一个最小的\(k\),使\(k\timesx\)不在合集中。题目非常简单明了。具体实现这时,看到这句话:\(1\lex\le10^{18}\),所以不可......
  • 题解 CF1830C【Hyperregular Bracket Strings】
    卡特兰数一个长为\(2n\)的序列,填入括号,有多少种合法方案?\(C_n=\sum_iC_iC_{n-i-1}\),其中\(C_0=C_1=1\)。它的封闭形式是\(C_n=\binom{2n}{n}-\binom{2n}{n-1}\)。problem给定一个长度\(n\)和\(k\)个子区间\(\{[l1​,r1​],[l2​,r2​],…,[lk​,rk​]\}\)。问有多......
  • 【题解】CF754D Fedor and coupons(优先队列)
    【题解】CF754DFedorandcoupons题目链接CF754DFedorandcouponsCF1029CMaximalIntersection后者是前者的加强版。思路分析最开始,先考虑不删区间\((k=0)\)的情况:也就是给你一大堆区间,让你找他们的交集。这个还是比较好想的,我们刚开始让第二个区间与第一个区间相交......
  • AtCoder Beginner Contest 221 G Jumping sequence
    洛谷传送门AtCoder传送门这个数据范围让我们不得不往背包想。但是两维相互限制。考虑坐标系旋转\(45°\),转化为两维不相互限制。那我们现在相当于要安排正负号,使得\(\sum\limits_{i=1}^n\pmd_i\)等于一个给定的值\(K\)。考虑两边加上\(\sum\limits_{i=1}^nd_i\)......
  • 【CF1841C 题解】
    首先,我们把\(s\)翻转。考虑dp,\(f_{i,j,k}\)表示到了第\(i\)个字符,操作了\(j\)个字符,最大的字符为\(k\)的最大值。转移时枚举\(i-1\)的最大字符\(\ell(0\le\ell<5)\)。不操作第\(i\)个字符;\(f_{i,j,k}=\max\{f_{i-1,j,\ell}+w\}\)。操作第\(i\)......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......
  • P2860 [USACO06JAN]Redundant Paths G 题解 tarjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespacestd;......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后可以发现......
  • CF402E Strictly Positive Matrix 题解 tarjan强连通分量
    题目链接:http://codeforces.com/problemset/problem/402/E题目大意:给出一个矩阵\(A\),问是否存在一个正整数\(k\)使得\(A^k\)解题思路:根据矩阵的性质,\(A^k_{i,j}\gt0\)当且仅当\(i\)到\(j\)所以可以把矩阵转成图论模型,若\(A_{i,j}\gt0\),则从\(i\)往\(j\)如果所有点......
  • AtCoder Beginner Contest 294 E
    AtCoderBeginnerContest294E-2xNGridProblemStatement题意:给你\(2\)行长度为\(L\)的矩阵。告诉你格子里面的数字,以\(vi\)\(li\)的形式:\(vi\)有\(li\)个问上下两个一样的有多少个?解释:以样例为例输入84312322331142133输出4第$1,$2,\(5\),8个上......