11,808
社区成员




丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。
输入描述:
共n+1 行。
第一行三个整数 n ,k ,p ,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;
接下来的 n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。
输出描述:
一个整数,表示可选的住宿方案的总数。
输入样例:
5 2 3
0 5
1 3
0 2
1 4
1 5
输出样例:
3
def find_count(n, k, p,info):
result =0
for i in range(n):
color1 = info[i][0]
new_cost = [info[i][1]]
key = False
for item in info[i+1:]:
new_cost.append(item[1])
# 判断是否为两间房
if item[0] == color1:
key = True
break
if key and min(new_cost)<=p:
result+=1
return result
if __name__=="__main__":
n, k, p = map(int, input().split())
# n, k, p =10,5,6
info = []
colors = []
for _ in range(n):
color, cost = map(int, input().split())
if color not in colors and len(colors)<k:
colors.append(color)
if len(colors)==k:
print("颜色已输入规定数量,之后输入请重复之前的颜色!")
info.append([color, cost])
# info = [[1,3],[2,0],[3,8],[2,9],[9,12],[32,67],[32,58],[9,5],[8,2],[1,8]]
out_num = find_count(n, k, p,info)
print("符合方案为:{}".format(out_num))
def findAccommodation(n, k, p, info):
dp = [[[0 for _ in range(p+1)] for _ in range(k+1)] for _ in range(n+1)]
# 初始化
for i in range(n+1):
dp[i][0][0] = 1
for i in range(1, n+1):
for j in range(1, k+1):
for cost in range(info[i-1][1], p+1):
dp[i][j][cost] = dp[i-1][j][cost] + dp[i-1][j-1][cost-info[i-1][1]]
total = 0
for j in range(1, k+1):
for cost in range(p+1):
total += dp[n][j][cost]
return total
# 读取输入
n, k, p = map(int, input().split())
info = []
for _ in range(n):
color, cost = map(int, input().split())
info.append((color, cost))
# 计算并输出结果
result = findAccommodation(n, k, p, info)
print(result)
def count_accommodation_plans(n, k, p, color_list, cost_list):
count = 0
for i in range(n - 2):
for j in range(i + 2, n):
if color_list[i] == color_list[j] and min(cost_list[i + 1:j]) <= p:
count += 1
return count
if __name__ == "__main__":
n, k, p = map(int, input().split())
color_list = []
cost_list = []
for _ in range(n):
color, cost = map(int, input().split())
color_list.append(color)
cost_list.append(cost)
result = count_accommodation_plans(n, k, p, color_list, cost_list)
print(result)
CSDN-Ada助手
算法
我们需要找到满足以下条件的方案数:
- 两位游客住在色调相同的两家客栈中。
- 两家客栈之间有一家咖啡店,其最低消费不超过 p。
我们可以使用两个数组来记录每种色调的客栈和咖啡店的信息。首先,我们遍历所有客栈,将它们按照色调分类存储在一个二维数组中。然后,对于每个色调,我们遍历该色调下的客栈和咖啡店,检查是否存在满足条件的方案。
具体步骤如下:
1. 读取输入的 n、k 和 p。
2. 创建一个二维数组 store[k][n+1],用于存储每种色调下的客栈和咖啡店信息。数组的第一维表示色调,第二维表示客栈编号。数组的元素 store[i][j] 表示第 j 家客栈的色调是否为 i。
3. 创建一个一维数组 coffee[n+1],用于存储每家客栈的最低消费。数组的第 i 个元素表示第 i 家客栈的最低消费。
4. 创建一个变量 count,用于记录满足条件的方案数,初始化为 0。
5. 遍历所有客栈,将它们按照色调分类存储在数组 store 中。
6. 对于每个色调 i,遍历该色调下的客栈和咖啡店:
- 如果存在满足条件的方案,即存在两家客栈之间的咖啡店的最低消费不超过 p,则将 count 增加 1。
7. 输出 count。
时间复杂度
- 遍历客栈和咖啡店的时间复杂度为 O(n)。
- 遍历色调和检查方案的时间复杂度为 O(kn)。
- 因此,总时间复杂度为 O(kn)。
空间复杂度
- 使用了 store 数组和 coffee 数组来存储数据,其空间复杂度为 O(kn)。
Java 代码
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int p = scanner.nextInt();
int[][] store = new int[k][n + 1];
int[] coffee = new int[n + 1];
for (int i = 1; i <= n; i++) {
int color = scanner.nextInt();
int cost = scanner.nextInt();
store[color][i] = 1;
coffee[i] = cost;
}
int count = 0;
for (int i = 0; i < k; i++) {
for (int j = 1; j <= n; j++) {
if (store[i][j] == 1) {
for (int l = j + 1; l <= n; l++) {
if (coffee[j] + coffee[l] <= p && store[i][l] == 1) {
count++;
break;
}
}
}
}
}
System.out.println(count);
}
}
C++ 代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k, p;
cin >> n >> k >> p;
vector<vector<int>> store(k, vector<int>(n + 1, 0));
vector<int> coffee(n + 1);
for (int i = 1; i <= n; i++) {
int color, cost;
cin >> color >> cost;
store[color][i] = 1;
coffee[i] = cost;
}
int count = 0;
for (int i = 0; i < k; i++) {
for (int j = 1; j <= n; j++) {
if (store[i][j] == 1) {
for (int l = j + 1; l <= n; l++) {
if (coffee[j] + coffee[l] <= p && store[i][l] == 1) {
count++;
break;
}
}
}
}
}
cout << count << endl;
return 0;
}
```
n, k, p = map(int, input().split())
count1 = 0 # 统计色调为0的客栈数量
count2 = 0 # 统计色调为1的客栈数量
for _ in range(n):
color, price = map(int, input().split())
if color == 0:
count1 += 1
elif color == 1:
count2 += 1
# 计算两个色调的客栈数量对应的组合数
result = count1 * (count1 - 1) // 2 + count2 * (count2 - 1) // 2
for i in range(2, count1 + 1):
for j in range(2, count2 + 1):
total_price = i * p + j * p # 计算组合中两家客栈咖啡店最低消费的总和
if total_price <= p:
result += 1
print(result)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k, p;
cin >> n >> k >> p;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].first >> v[i].second;
}
int cnt[k] = {0};
for (int i = 0; i < n; i++) {
cnt[v[i].first]++;
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (v[i].first == v[j].first) {
for (int k = i; k <= j; k++) if (v[k].second <= p)
{
ans += 1;
break;
}
}
}
}
cout << ans << endl;
return 0;
}
nnnnnnnnnnnnnnnnnn
n, k, p = map(int, input().strip().split())
inn = []
for i in range(n):
inn.append(list(map(int, input().strip().split())))
res = 0
dp = [[0]*2 for _ in range(k)]
for i in range(n):
res += dp[inn[i][0]][0] if inn[i][1] <= p else dp[inn[i][0]][1]
dp[inn[i][0]][0] += 1
if inn[i][1] <= p:
for j in range(k):
dp[j][1] = dp[j][0]
print(res)
感觉很强
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, k, p;
cin >> n >> k >> p;
vector<pair<int, int>> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i].first >> v[i].second;
}
int cnt[k] = {0};
for (int i = 0; i < n; i++) {
cnt[v[i].first]++;
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (v[i].first == v[j].first && v[i].second + v[j].second <= p) {
ans += cnt[v[i].first];
}
}
}
cout << ans << endl;
return 0;
}
用golang写了三个for循环和数据类型转换就超时,不知道为什么