2022暑期个人训练赛第33场

这两天身体似乎有点疲倦了,精神上也有些波动.更新可能会跟不上速度

问题 A: 阿Q的记忆

题目描述

阿Q登山回来,觉得山都长得一个样子。她记得某一段:她往下走了1米,再往下走了1米,然后往上走了1米,然后balabalabala……用一个包含U和D的字符串表示。U表示向上1米,D表示向下1米。她还记得全程起点的高度,终点的高度,以及她一共走了多少时间(一个单位时间内,她会使自己海拔升高或降低1米)。她知道山的任意位置的海拔都是非负的。她想知道,自己的记忆有没有自相矛盾。

输入

多组测试数据,对于每组测试数据:第一行,三个整数n,S,T,表示走的次数,起点、终点海拔;第二行,由U和D构成字符串,表示中间某一段的情况;

输出

对于每组测试数据,如果自相矛盾,输出NO,否则输出YES。

样例输入

4 0 4
UU
4 0 4
D

样例输出

YES
NO
提示
对于100%的数据n,S,T<=100000 字符串长度<=50

这个题一直27分WA实在是羞愧,下面是我当时的思路
1就是首先要确保在过程中不会出现负的.这个如果出现负的我的思路是可以假设这段回忆之前如果全为正的也拉不上来肯定错误(貌似这里存在问题,如果第二次出现负的,其实应该错误了,但是因为之前的能把上一个负的拉上来,这个也不在话下,出现错误)
2看看走完这段路之后距离终点,加起来比n大,错误,和n的差值是奇数,错误//突然发现昨天竟然写成了n%步数...无语了

在CSDN上看到的这个思路就解决了我思路中存在的问题.
设置一个量来统计为负的时候.在过程之中出现一次-1它就+1,最后和n比较,实属妙哉

代码

#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int n,s,t;
signed main()
{
	while(cin>>n>>s>>t)
	{
		string s;
		cin>>s;
		bool ju=1;
		int k=s.length();
		for(int i=0;i<s.length();i++)
		{
			if(s[i]=='U')s++;
			else s--;
			if(s<0)k++,s++;
		}
		if(k+abs(s-t)>n)ju=0;
		if((n-(k+abs(s-t)))%2)ju=0;
		if(ju)cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

问题 B: 打包

题目描述

某个工厂生产出的产品都要被打包放入正四棱柱的盒子内。所有盒子的高度都为h,但底面的尺寸不同,可以为11,22,33,44,55,或66,如图所示。
image

这些盒子将被放入高度为h,底面尺寸为66的箱子里,送到消费者手中。为了降低运送成本,工厂希望尽量减少箱子的数量。如果有一个好的算法,能使箱子的数量降到最低,这将给工厂节省不少资金。请你写一个这样的程序。

输入

六个非负整数a1, a2, a3, a4, a5, a6。它们分别为底面尺寸为11,22,33,44,55,66的盒子的个数。每两个数之间有一个空格。

输出

一个数B,即箱子的最少个数。
例如a1, a2, a3, a4, a5, a6分别为0, 0, 4, 0, 0, 1时,B=2;又例如a1, a2, a3, a4, a5, a6分别为7, 5, 1, 0, 0, 0时,B=1。如图所示。
image

样例输入

0 0 4 0 0 1

样例输出

2
感觉把各种情况罗列一下,if就可以了吧,此处不再赘述,用草稿纸比划比划,代码可能略微冗长了些.....

代码

#include<iostream>
#include<cmath> 
#define int long long
using namespace std;
int a[7],ans;
int w2(int x,int y)
{
	if(x==0&&y==0)return 0;
	int z=0;
	z+=y/9;
	y%=9;
	z+=x/36;
	x%=36;
	if(y*4+x<=36)return z+1;
	z++;
	x=x-(36-4*y);
	y=0;
	return z+1;
}
signed main()
{
	for(int i=1;i<=6;i++)
		cin>>a[i];
	ans=a[6];
	ans+=a[5];
	if(a[1]>=a[5]*11)a[1]-=a[5]*11;
	else a[1]=0;
	ans+=a[4];
	if(a[2]>=a[4]*5)a[2]-=a[4]*5;
	else a[2]=0;
	ans+=a[3]/4;
	a[3]%=4;
	if(a[3]==0)
	{
		ans+=w2(a[1],a[2]);
	}
	else if(a[3]==1)
	{
		if(a[2]<=5&&a[2]*4+a[1]<=27)ans++;
		else
		{
			ans++;
			if(a[2]>5)
			{
				a[2]-=5;
				if(a[1]>=7)a[1]-=7;
				else a[1]=0;
			}
			else 
			{
				a[1]=a[1]-(27-a[2]*4);
				a[2]=0;
			}
			ans+=w2(a[1],a[2]);
		}
	}
	else if(a[3]==2)
	{
		if(a[2]<=3&&a[2]*4+a[1]<=18)ans++;
		else
		{
			ans++;
			if(a[2]>3)
			{
				a[2]-=3;
				if(a[1]>6)a[1]-=6;
				else a[1]=0;
			}
			else
			{
				a[1]=a[1]-(18-a[2]*4);
				a[2]=0;
			}
		}
		ans=ans+w2(a[1],a[2]);
	}
	else
	{
		if(a[2]<=1&&a[2]*4+a[1]<=9)ans++;
		else
		{
			ans++;
			if(a[2]>1)
			{
				a[2]-=1;
				if(a[1]>5)a[1]-=5;
				else a[1]=0;
			}
			else
			{
				a[1]=a[1]-(9-a[2]*4);
				a[2]=0;
			}
		}
		ans=ans+w2(a[1],a[2]);
	}
	cout<<ans;
	return 0;
}

算了,水题到此为止了.倦了,莫名烦躁

posted @ 2022-08-13 19:30  qbning  阅读(40)  评论(0)    收藏  举报
描述