codeforces 11/10
这是是第一题的链接
这道题的数据范围给的很小,我们只需要模拟一下,就可以过了
代码如下:
for i in range(int(input())):
x,a,b=map(int,input().split())
count1,count2=0,0
c=list(input()*1000)
for i in range(1000):
if count1==a and count2==b:
print("YES")
break
elif c[i]=="S":count2-=1
elif c[i]=="W":count1-=1
elif c[i]=="N":count2+=1
elif c[i]=="E":count1+=1
else:
print("NO")
这是是第二题的链接
这道题就是一个找规律的问题,因为第一个元素总是c值,所以先判断c值与n的大小关系,如果c值大于等于n值,说明点都在0~n-1范围外,需要交换n-1次,而对于间隔为0的一系列数字。
因为其数组所有元素值都相等,没有单调性质,所以只有n-2到n-1时才是可以变为置换的,而对于其他情况,只要求出来在0~n-1有多少点,最后用n值一减即可。下面代码中(n-c+b-1)//b
这段代码为什么要加b-1呢?
-> 我们要求这段区间内的点的个数,并且已经事先知道这些点的间隔是是b了,在知道区间左端点必定是一个满足条件的值,我们加b-1是怕万一余数不为零的时候,我们在运算"//"符号
时就可以把余数那部分的那个满足条件的值加上,保证了数据的准确。
附上代码:
for _ in range(int(input())):
n, b, c = map(int, input().split())
if n <= c:
print(n)
elif b == 0 and (c + 1) < n - 1:
print("-1")
elif b == 0:
print(n-1)
else:
y = ((n - c + b - 1) // b)
print(n - y)
这是本来的代码,如果看不懂,可以参考下面的代码:
for _ in range(int(input())):
n,a,b = map(int,input().split())
if n <= b:
print(n)
elif a == 0 and b < n-2:
print("-1")
elif a == 0:
print(n-1)
else:
aa,bb = divmod(n - b ,a)
if bb!=0:
aa += 1
print(n-aa)