Education div2 1469总结及补题

A题是真坑爹呀
啊啊
You are given a sequence s of n characters (, ), and/or ?. There is exactly one character ( and exactly one character ) in this sequence.
谁能想到这句话的意思是这个字符串中只包含一个左括号和一个右括号
aiaiai,怪不得我觉得别人的代码有问题。

B题
题意是,给两个字符串,组合成一个字符串,但是相对顺序不能改变。求最大前缀和。直接把第一个字符串和第二个字符串的最大前缀和加起来就行。我去看一下dp怎么写
部分人都是思维写的,dp太简单了,
C题
题意是有凹凸不平的地面,有n个长度为k的宽度 为1的柱子吧。要求至少所有的柱子有一个公共的边,然后你可以提高k-1范围内的高度
如上
问能否满足条件。
注:第一个和最后一个不能升高

  • 思路
    由于第一个位置已经确定,那么第二个的位置范围肯定确定了。一次类推都可以确定一个范围,如果这个范围长度为0或者为负,那必然不满足题意了
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
const int N = 2e5+10;

using namespace std;

int h[N],f_h[N];
void solve()
{
    
    
   int n,k;
   cin>>n>>k;
   for(int i=1;i<=n;i++)
   {
    
    
   	cin>>h[i];
   }
   
   bool judge=false;
   int l=h[1],he=h[1];
   for(int i=2;i<=n;i++)
   {
    
    
   	l-=k-1;
   	he+=k-1;
   	l=max(l,h[i]);
   	he=min(he,h[i]+k-1);
   	if(l>he)
   	{
    
    
   		judge=true;
   		break;
   	}
   }
   if(h[n]<l||h[n]>he)
   judge=true;
   if(judge)
   cout<<"NO"<<endl;
   else
   {
    
    
   	cout<<"YES"<<endl;
   }
   
}

int main()
{
    
    
   int t;
   cin >> t;
   while (t--)
   {
    
    
   	solve();
   }
}

虽然是借鉴别人的思路,但是自己确实想明白了,(想明白了80%~90%吧)垃圾呜呜呜呜。

D题
题意,一个长度为n的数组,Ai=i;
每次操作,取x,和y两个下标,不相等,然后Ax=Ax/Ay上取整;
问能否在最后数组有n-1个1,1个2
最多操作不能超过n+5次 。
思路:
自然的想法就是把x分别取3,4,…,n−1,y=n,最后取x=n,y=2,但这样的操作数是n−3+log2n,n较大时,超过了n+5。

因为x为n,y为2的操作数过多,我们设法让y变大一点,比如y取15,这样log15n就不超过5了,而log215也最多4,多试几个数就能过了。(想精确的可以列出式子logxn+log2x求个最值)

也就是x=3,4,…,b−1,b+1,…,n−1,y=n,然后x=n,y=b,直到第n个数变成1,然后x=b,y=2,直到第b个数变成1。
大佬的一个思路,操一点想到,aaaa,其实想到了已经,但是我取得是20,未尝不可,没有想到用pair存起来。。。

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstring>
const int N = 2e5 + 10;

using namespace std;


void solve()
{
    
    
	vector< pair<int,int> > out;
	int n;
	cin >> n;
	int base=16;
	for(int i=3;i<n;i++)
	{
    
    
		if(i==base)
		continue;
		out.push_back({
    
    i,n});
	}
	if(n>base)
	{
    
    
		int x=n;
		while(x!=1)
		{
    
    
			out.push_back({
    
    n,base});
			x = ceil(x* 1.0 / base);
		}
		x=base;
		while(x!=1)
		{
    
    
			out.push_back({
    
    base,2});
			x = ceil(x * 1.0 / 2);
		}
	}
	else
	{
    
    
		int x=n;
		while(x!=1)
		{
    
    
			out.push_back({
    
    n,2});
			x = ceil(x * 1.0 / 2);
		}
	}
	cout<<out.size()<<endl;
	for(int i=0;i<out.size();i++)
	{
    
    
		cout<<out[i].first<<" "<<out[i].second<<endl;
	}
}

int main()
{
    
    
	//cout<<pow(10,6)<<endl;
	int t;
	cin >> t;
	while (t--)
	{
    
    
		solve();
	}
}

ceil用法

猜你喜欢

转载自blog.csdn.net/qq_46264636/article/details/112605209
今日推荐