错题日志(哈理工热身赛)

2.酸甜

因为只学过简单的排序冒泡,但是数据量给的太大了,所以考察的实际上是结构体(使两个数组放到一个sort里进行比较)和sort函数的考察。

多数组结构体样例:(默认public)

struct awa{
long long a,b
)nd[long];(简写写在这里)

就可以将两个数组整合到一个结构体里(图书馆)

结构体的输入方式:

for(int a=0;a<n;a++)
{
    scanf("%d",&nd[a].a);
}
for(int a=0;a<n;a++)
{
    scanf("%d",&nd[a].b);
}

不知道是不是只有简写写了数组的格式才可以输入数组的格式,晚上回去学习一下,这样子就可以在一个结构体里面保存两个数组

sort的结构格式

sort(nd,nd+n,cmp)

cmp的格式

bool cmp(awa &s,awa &y)
{
    //逻辑是当甜度不同时,甜度高的优先,甜度相同时,将酸度低的排在前面。
    if(s.b!=y.b) return s.b>y.b;//判断符号为你想要结果的符号
    else return s.a<y.a;
}

2.jay的小迷弟

这个我能力不足就没有写到,是一个字符串问题,考验了思维的慎密性。

#include<bits/stdc++.h>
const long long mod=1e9+7;
char arr1[100000005];
using namespace std;
int main()
{
	//判断jay和j,a,y的个数
	//对于一共具有多少个散的jay,可以取jay中三个字母中最小的那一个。 
	//string s1;
	long long jay=0;
	//cin.getline(arr1,1e8);
	//scanf("%s",arr1);
	//cin >> arr1;
    gets(arr1);//牛客上不给用gets
    
	long long sumj=0,suma=0,sumy=0;
	for(int a=0;a<strlen(arr1);a++){//jay整型的计数 
		if(a<strlen(arr1)-2){
			if(arr1[a]=='J'&&arr1[a+1]=='a'&&arr1[a+2]=='y'){
				jay++;
				a+=2;	
			} 
			}
		if(arr1[a]=='a') suma++;
		else if(arr1[a]=='y') sumy++;
		else if(arr1[a]=='J') sumj++;
	}
	long long ans=min(suma,(sumj,sumy));
	//cout << ans << jay;
	if(ans==0&&jay>0)
		jay--,ans++;
	for(int i=jay;i>0;i--){
		ans=2*ans%mod;
	}
	cout << ans;
	return 0;
}

窗外的麻雀,在电线杆上多嘴。你说这一句,很有夏天的感觉。

作为Jay的小迷弟,LakerV非常想去Jay的演唱会。

有一天,他意外地发现他买的《周杰伦的床边故事》上出现了一行神秘的字符串,并且这本书给了他一个神奇的魔法。

现在,只要他能得到最多的”Jay”的碎片数量,他就能获得Jay演唱会的门票了。但兴奋的他现在正在打包行李,无暇考虑如何得到最多的”Jay”的碎片数量,请聪明的你告诉他该怎么做。

“Jay”碎片拼凑的规则:

如果原字符串中有’J’,’a’,’y’这三个字符,那么LakerV可以用它们得到一个“Jay”的碎片。

魔法使用方法:

如果原字符串中的有一个未被使用过的且连续的“Jay”字符串,那么LakerV可以用它们对当前手上“Jay”的碎片数量*2。

ps:1.魔法可以使用无限次

2.由于数可能非常大,所以需要对结果取模1e9+7

3.一开始LakerV手上”Jay”碎片的数量为0

4.未被使用过的且连续的“Jay”字符串如果用于魔法,那么该连续的“Jay”字符将不能用于得到一个“Jay”的碎片。

条件比较复杂,大致为判断单独的连续jay字符和以及片段的j,a,y字符碎片可以凑成多少jay。首先要有清晰的对于连续字符判断的方法(这题数据太大使用string超时不知道为什么),使用char数组类型存储字符串,在使用scanf后可以遍历字符串,1.给定边界,2.连续三个判断,3.在判断完成后加上2。可以在一个for循环中直接判断整形与碎片,因为整形实际上没有continue只是判断了已经存储的数组值,所以根据时间顺序可以全部得到。然后就是取三个碎片中的最小值充当可以合成的jay数量。最后对于魔法和乘法的操作逻辑清晰。先判断是不是有一个,一个都没有就用一个使用魔法,加一减一,不用写else直接进行剩余整形的倍数乘法,使用一个for循环就可以得到n次方的效果,在每次循环结束的时候进行取余操作。

3.跳一跳

一道模拟题,在我一开始的想法里是需要模拟自己的跳跃过程,需要用for循环遍历从当前位置到当前位置加上权的每一个跳跃位置,就想着使用函数来完成多次的循环,但是想不到结束条件,递归学的也不好不知道怎么写。看很多人写出来感觉很震惊。结果出来以后,发现是用更巧妙的方法来分析了题目,具有思维量,还是很震惊做出来这题的比第三题的都多。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n;
	cin >> n;
	long long arr1[n];
	for(int a=1;a<=n;a++){
		cin >> arr1[a];
	}
	long long ans=1;
	for(int a=1;a<=n;a++){
		if(a>ans) break;
		ans=max(ans,a+arr1[a]);
		ans=min(ans,n);
	}
	cout << ans;
	return 0;
}

使用了模拟操作,对于for行为的理解有了更深刻的理解,同时对条件设计和思考应该有更多的了解。

4.乘与除

这个题主要是先人肉理解题目含义,不是模拟而是翻译操作再改编为程序语言。可能有四个操作,0.1.2.3,对于操作0(有一),1(两个一样的),2(乘起来有一个或者除以有一),3(所有都可以,乘起来再一个个除除以两个)。主要是思维上的训练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值