题目1:飞行棋,输入K(距离),N(掷骰子的次数),问最后飞行棋到终点的距离是多少?,需要返回多少次?(因为飞行棋如果超出终点的话会返回的)如果为0的话输出“paradox”。
坑是最后一步到达终点,不能算输出paradox,96%ac。
以及k可以是0,这时直接输出
# k, n = list(map(int, input().split()))
# x = list(map(int, input().split()))
k, n = 10,3
x=[4,1,5]
count = 0
temp = k
if temp == 0:
print("paradox")
else:
for i in x:
temp -= i
if temp == 0:
break
elif temp > 0:
continue
else:
temp = -temp
count += 1
if temp:
print(abs(temp), count)
# 下面这一步就是那个坑
elif i==x[-1]:
print(i, count)
else:
print("paradox")
题目2:骰子的六个面是1到6组成,12、34、56相对(好像有这个条件)。输入是N和N个观察序列(序列是骰子的上下左右前后面的数字),问有几种不同的骰子,并降序输出不同骰子的个数。
没有别的方法,数学题,当时浪费很多时间
重点在于如何给这个骰子定义个标准化的方法,下面是把1移到最上面(不同面的变换画画图),然后把此外最小的3移到最左边。那么就能够定义全部结果。
作者:Brown-2
链接:https://www.nowcoder.com/discuss/465035?type=post&order=time&pos=&page=1&channel=666&source_id=search_post
来源:牛客网
N = int(input())
nums = []
for i in range(N):
nums.append(list(int(x) for x in input().split()))
def trans(num):
i = num.index(1)
if i == 0:
pass
elif i == 1:
num[0], num[1], num[2], num[3] = num[1], num[0], num[3], num[2]
elif i % 2 == 0:
num[0], num[1], num[i], num[i + 1] =
num[i], num[i + 1], num[1], num[0]
else:
num[0], num[1], num[i - 1], num[i] =
num[i], num[i-1], num[0], num[1]
l2 = min(num[2:])
i = num.index(l2)
if i == 2:
pass
elif i == 3:
num[2], num[3], num[4], num[5] = num[3], num[2], num[5], num[4]
elif i == 4:
num[2], num[3], num[4], num[5] = num[4], num[5], num[3], num[2]
else:
num[2], num[3], num[4], num[5] = num[5], num[4], num[2], num[3]
return num
d = {}
for i in nums:
i = tuple(trans(i))
d[i] = d.get(i, 0) + 1 # 字典get默认为0,因为没出现过的排列都是0
M = len(d)
res = list(d.values())
res.sort(reverse = True)
print(M)
print(*res)
题目3:吃东西,N,M是中餐和晚餐的套餐个数,T是需要满足的最少的美味值
输入:N行,每行两个数,xi和yi分别表示热量和美味值,再输入M行,每行两个数,xi和yi分别表示热量和美味值。
输出:中餐和晚餐的美味值>=T的情况下,热量值是多少?
注意中、晚餐各自都只能吃一顿,满足不了>=T输出-1,T=0时输出0
开始想成了背包问题,但是要知道每一顿只能吃一个套餐啊,注意空间优化的遍历就完事了
作者:小健0601
链接:https://www.nowcoder.com/discuss/465041?type=post&order=time&pos=&page=1&channel=666&source_id=search_post
来源:牛客网
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<stack>
#include<queue>
using namespace std;
int M,N,T;
struct item{
int X,Y;
};
item m[100100],n[100100];
int minX[100100];
bool cmp(const item &a,const item &b){
return a.Y < b.Y;
}
int ans = 0x7f7f7f7f;
int main(){
scanf("%d%d%d",&M,&N,&T);
if(T==0){
cout<<"0";
return 0;
}
for(int i = 0;i < M;i++){
scanf("%d%d",&m[i].X,&m[i].Y);
}
for(int i = 0;i < N;i++){
scanf("%d%d",&n[i].X,&n[i].Y);
}
sort(m,m+M,cmp);
sort(n,n+N,cmp);
for(int i = 0;i < M;i++){
if(m[i].Y >= T && m[i].X < ans){
ans = m[i].X;
}
}
for(int i = 0;i < N;i++){
if(n[i].Y >= T && n[i].X < ans){
ans = n[i].X;
}
}
minX[N] = 0x7f7f7f7f;
// 下面这个for什么意思呢,因为是按美味值升序排列了,这个minX[i]就是保存了i这个下标之后最小的能量值,后面会用到。
// 因为这个下标之后的美味值都符合要求了(当下标i的美味值符合要求,后面的都比他美味值大)
for(int i = N - 1;i >= 0;i--){
minX[i] = min(n[i].X,minX[i + 1]);
}
// 第二个数组从后面开始遍历
int j = N - 1;
for(int i = 0;i < M;i++){
//先定位到最左边的符合美味值要求的下标之前一个,注意这里定位到了之前一个
while(j >= 0 && n[j].Y + m[i].Y >= T)--j;
// 所以第一个符合要求的下标就是j+1,然后用这个下标去取minX,就是这个下标之后的所有套餐(美味值递增)中的最小能量
// 然后小于ans的话就替换
if(n[j + 1].Y + m[i].Y >= T && minX[j + 1] + m[i].X < ans){
ans = minX[j + 1] + m[i].X;
}
}
// ans还是原始值的话说明T太大了,没有满足>=T要求的组合
if(ans >= 0x7f7f7f7f) cout<<"-1";
else cout<<ans;
return 0;
}
题目4:6*6的地图种6种蔬菜,地图中‘“#”的地方是障碍物,要求上下左右不同种类,问方法数。
dp没时间了