A
你有1-6号六种模型:
给你一个只包含上述六种模型的图,长度为n,宽为2,问你能否通过旋转图转的一些模型,使得这些模型连成一条线从左上角到右下角。如:
思路/过程: 这个题看着挺唬人的,刚开始我就被吓住了,但其实一点都不难。1、2是一样的,3、4、5、6是一样的(因为可以旋转)。然后顺着路径模拟一遍过程就行了。
题解就不写了。
int n;
cin>>n;
for(int i=0;i<n;i++)
{
char x;
cin>>x;
if(x<='2') a[i][0]=1; //1、2都算1
else a[i][0]=2; //3、4、5、6都算2
}
for(int i=0;i<n;i++) //第二行
{
char x;
cin>>x;
if(x<='2') a[i][1]=1; //第一行为0,第二行为1
else a[i][1]=2;
}
bool flag=true;
int k=0; //起点为第1行
for(int i=0;i<n;i++)
if(a[i][k]==2) //路径上有2类即为换行
{
if(a[i][!k]==2) k=!k; //如果只有一个第二类即为死路
else flag=false;
}
if(k==1&&flag) puts("YES"); //终点在第二行
else puts("NO");
B
pi(n)是一个 [i,1,2…,i-1,i+1,…,n] 序列,给你一个包含m个数的数组a[]。
pos(p,x)为x在p数组中的位置,如pos(p2(4),2)=1。
f( p )=sum| pos(p,a[i])-pos(p,a[i+1]) |。
求f(p1(n)),f(p2(n)),…,f(pn(n))。
过程: 这个题一开始我我以为是能做出来的,结果弄了一个小时,最后也只是找到了O(n2)的解法,O(n)的做法不会。导致了后面的题差点没做完。
C
你的手机上最多可以展示k个联系人的消息,最初屏幕是空的。突然你有了预知未来的能力,你知道今天你会收到n条消息,第i条信息是ID为id[i]的朋友给你发的。
如果id[i]朋友给你发了一条消息,且id[i]朋友之前发的消息在屏幕上,那么消息列表中的顺序不会发生改变。但如果id[i]朋友之前发的消息没有在屏幕上,或者之前没有发过消息,那么这个消息会出现在消息栏的顶部,之前的消息全部后移一位,原来的第k条消息就会被挤掉。
问这一天过后消息列表中消息从上到下的朋友的ID顺序是什么。
这个题也比较的简单按照它说的进行模拟就行了。这个题可能是难在题意上,我当时做的时候就被题意绕进去了,被绕了很久才出来的。
D
你有n件货物要卖,每件货物的原来的价格为a[i]。你要给所有的货物定一个新的价格,要求所有货物的价格相同,且所有货物价格的总和要大于等于所有货物原来价格的总和。问这个新的价格为多少。
水题,只需要求出所有货物原价格的平均值的上取整即可。
E
给你一个字符串s,和q组询问/指令。
指令1:输入pos和字符c,然后将s中pos位置的字符改为c。
指令2:输入l和r,然后找出s的[l,r]区间中有多少种字符。
D.Distinct Characters Queries
过程: 这个题我当时看的时候想到了是不是可以用树状数组来做(后来我看了看题解发现真的可以用树状数组来做),但我发现:树状数组我学了以后一直没用过,给忘了……(就拿这个题来复习了)
F
你的手机上最多可以展示k个联系人的消息,最初屏幕是空的。突然你有了预知未来的能力,你知道今天你会收到n条消息,第i条信息是ID为id[i]的朋友给你发的。
如果id[i]朋友给你发了一条消息,且id[i]朋友之前发的消息在屏幕上,那么消息列表中的顺序不会发生改变。但如果id[i]朋友之前发的消息没有在屏幕上,或者之前没有发过消息,那么这个消息会出现在消息栏的顶部,之前的消息全部后移一位,原来的第k条消息就会被挤掉。
问这一天过后消息列表中消息从上到下的朋友的ID顺序是什么。
C题的困难版,扩大了数据范围。
思路/过程: 这个困难版其实也不能难,加一个map来记录列表中的id就行,这样查询就变成了O(1)。然后删除操作可以直接用vector中的erase()函数。