

简单模拟,蜜汁WA。

因为错了还是写一下思路:

先保存,然后倒着(n到1)枚举覆盖目标点的毯子,找到即是答案。

#include
#include
#include
#include
#include
#include
#include
#include
#include


显而易见的四重循环暴力,第一层枚举颜色,第二层枚举枚举第一个客栈,第三层枚举另一个同色客栈,第四层枚举两客栈中间的客栈(包括两同色客栈),找到就+1。
这是最暴力的:
#include
#include
#include
#include
#include
#include
#include
#include
#include
然后其实上面那个O(不知多少)的算法可以优化为O(n)的做法。
思路就是,从1到n枚举,输入color和price的值,我们需要记录一个距离第二个客栈最近的咖啡厅价钱合理的客栈位置,用一个now变量记录。
开三个辅助数组,last[i]表示最后一个以i为颜色的客栈的位置,cnt[i]表示以i为颜色的客栈总数,sum[i]可以看作是一个临时数组,用来存储当前的方案数。
可以这么想,当前枚举到一个客栈i,这个i是第二个客栈,那么显然第一个客栈一定在第二个客栈之前,编号必定是0~i-1之间的一个数。如果我发现枚举的时候在某一个客栈前面有一个价钱合理的咖啡厅,那么在这之前的任何一个同色客栈都是第一个客栈可以选的,那么统计一下数量,这就是当前的方案数。
然后更新last数组,更新ans,让cnt[color]++,这样从左到右地推过来就好了。
#include
using namespace std;
#define RG register
#define ll long long
#define in(x) x = read()
#define lin(x) scanf("%lld",&x)
#define llin(x) x = lread
#define din(x) scanf("%lf",&x)
#define dout(x) printf("%lf",x)
#define out(x) print(x)
#define lout(x) printf("%lld",x)
#define ex putchar('\n')
#define ko putchar(' ')
const int MAXN = 55;
int n,k,p;
int color,price;
int last[MAXN],sum[MAXN],cnt[MAXN];
int ans = 0;
int now;
inline int read()
{
int X=0,w=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
inline ll lread()
{
ll X=0,w=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
void print(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
print(x/10);
}
putchar(x%10+'0');
}
int main()
{
in(n);in(k);in(p);
for(int i = 1;i <= n;i++)
{
in(color);in(price);
if(price <= p)
now = i;
if(now >= last[color])
sum[color] = cnt[color];
ans += sum[color];
last[color] = i;
cnt[color]++;
}
out(ans);
return 0;
}
总而言之,四条剪枝原则:
(1)交换两个颜色相同的块没有意义
(2)一个块的左边是非空块时不需要考虑左移,因为会和之前的块右移重复,即只有当左块为空时才左移
(3)根据题目优先度的排序,可以知道,右移优先于左移,所以在dfs时先考虑右移
(4)如果有一种颜色当前的块数目x满足1<=x<=2,则此情况不合法
#include
#include
#include
#include
#include
#include
#include
#include
#include
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/127026.html