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(所有都可以,乘起来再一个个除除以两个)。主要是思维上的训练。