> 文章列表 > AcWing第 100 场周赛

AcWing第 100 场周赛

AcWing第 100 场周赛

4953. 比赛

n 个人参加乒乓球比赛。

比赛一共进行了 n−1 场。

每场比赛举办方都需要准备 2×b+1 瓶水,其中 2×b 瓶水给选手(每场比赛 2 人参加,每人 b 瓶),1 瓶水给裁判。

此外,所有参加比赛的 n 名选手,每名选手在比赛期间总共会得到举办方准备的 p 条毛巾。

请你计算,举办方一共需要准备多少瓶水和多少条毛巾。

输入格式

共一行,三个整数 n,b,p。

输出格式

两个整数,表示所需准备的水的数量和毛巾的数量。

数据范围

前 33 个测试点满足 1≤n,b,p≤10。
所有测试点满足 1≤n,b,p≤500。

输入样例1:

5 2 3

输出样例1:

20 15

输入样例2:

8 2 4

输出样例2:

35 32
// Online C++ compiler to run C++ program online
#include <iostream>
using namespace std;
int main() {int n,b,p;cin>>n>>b>>p;cout<<(n-1)*(2*b+1) << " "<< p*n;
}

4954. 挑选

给定一个包含 n 个正整数 a1,a2,…,an 的集合。

集合中可能存在数值相同的元素。

请你从集合中挑选一些元素,要求同时满足以下所有条件:

  1. 被选中元素不少于 2 个。
  2. 所有被选中元素之和不小于 l 且不大于 r。
  3. 所有被选中元素之中最大元素与最小元素之差不小于 x。

请问,一共有多少种不同的选法。

注意:

  • 不考虑元素顺序,{a1,a2} 和 {a2,a1} 应当视为同一种选法。
  • 不同元素即使数值相同,也应当视为不同个体,即使 a1=a2

输入格式

第一行包含四个整数 n,l,r,x。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

一个整数,表示不同选法的数量。

数据范围

前 33 个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤15,1≤l≤r≤109,1≤x≤106,1≤ai≤106。

输入样例1:

3 5 6 1
1 2 3

输出样例1:

2

输入样例2:

4 40 50 10
10 20 30 25

输出样例2:

2

输入样例3:

5 25 35 10
10 10 20 10 20

输出样例3:

6

 

#include<bits/stdc++.h>
using namespace std;int main()
{int n, l, r, x, ans = 0;scanf("%d%d%d%d", &n, &l, &r, &x);vector<int> a(n);for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);for (int i = 1; i < 1 << n; i ++ ){int mi = 2e9, mx = 0, cnt = 0;long long sum = 0;for (int j = 0; j < n; j ++ )if (i >> j & 1){cnt ++ ;mi = min(mi, a[j]);mx = max(mx, a[j]);sum += a[j];}if (cnt == 1) continue;if (sum >= l && sum <= r && mx - mi >= x) ans ++ ;}printf("%d", ans);return 0;
}

 4955. 牌堆

有 n 张纸牌,编号 1∼n。

其中,第 i 张纸牌的价值为 vi。

你要玩一个游戏,具体流程如下:

首先,你要将 n 张牌一张叠一张地堆成一个牌堆,牌堆中纸牌的具体排列顺序由你决定。

接下来,你需要依次进行 m 次操作

关于第 i 次操作:

  • 你的任务是将编号为 ai 的纸牌从牌堆中抽出,并置于牌堆顶部。
  • 如果执行此次操作时,不存在纸牌位于纸牌 ai 之上,即纸牌 ai 本来就位于牌堆顶部,则此次操作无需付出任何代价。
  • 如果执行此次操作时,存在纸牌位于纸牌 ai 之上,则此次操作需要付出代价,具体代价为所有位于纸牌 ai 之上的纸牌的价值之和(不要将价值和编号混淆)。

请你合理安排初始时牌堆中的纸牌排列顺序,从而使得执行完所有操作需要付出的总代价尽可能小。

输出总代价的最小可能值。

例如,如果一共有 3 张纸牌,价值分别为 1,2,3 一共需要进行 5 次操作,每次操作需要置于牌堆顶部的卡牌分别为 1,3,2,3,1。

那么一种最佳的初始时牌堆中纸牌排列顺序为从上到下依次为纸牌 1,3,2。

具体操作过程如下:

  • 第 11 次操作,需要将纸牌 11 置于牌堆顶部,由于纸牌 11 本来就在牌堆顶部,因此,所需代价为 00,执行完此次操作后,牌堆中纸牌排列顺序仍为 1,3,21,3,2。
  • 第 22 次操作,需要将纸牌 33 置于牌堆顶部,由于纸牌 11 位于纸牌 33 之上,因此,所需代价为 v1=1�1=1,执行完此次操作后,牌堆中纸牌排列顺序为 3,1,23,1,2。
  • 第 33 次操作,需要将纸牌 22 置于牌堆顶部,由于纸牌 1,31,3 位于纸牌 22 之上,因此,所需代价为 v1+v3=4�1+�3=4,执行完此次操作后,牌堆中纸牌排列顺序为 2,3,12,3,1。
  • 第 44 次操作,需要将纸牌 33 置于牌堆顶部,由于纸牌 22 位于纸牌 33 之上,因此,所需代价为 v2=2�2=2,执行完此次操作后,牌堆中纸牌排列顺序为 3,2,13,2,1。
  • 第 55 次操作,需要将纸牌 11 置于牌堆顶部,由于纸牌 2,32,3 位于纸牌 11 之上,因此,所需代价为 v2+v3=5�2+�3=5,执行完此次操作后,牌堆中纸牌排列顺序为 1,3,21,3,2。

付出的总代价为 0+1+4+2+5=120+1+4+2+5=12。

输入格式

第一行包含两个整数 n,m。

第二行包含 n 个整数 v1,v2,…,vn。

第三行包含 m 个整数 a1,a2,…,am。

输出格式

一个整数,表示总代价的最小可能值。

数据范围

前 33 个测试点满足 2≤n≤3,1≤m≤5。
所有测试点满足 2≤n≤500,1≤m≤1000,1≤vi≤100,1≤ai≤n。

输入样例:

3 5
1 2 3
1 3 2 3 1

输出样例:

12

 

#include <bits/stdc++.h>
using namespace std;const int N = 1010;
int v[N], p[N], e[N], q[N], tot;
bool st[N];
int main()
{int n, m;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ) scanf("%d", &v[i]);for (int i = 1; i <= m; i ++ ) scanf("%d", &p[i]);for (int i = 1; i <= m; i ++ )  if (!st[p[i]])  {e[++ tot] = p[i];  q[p[i]] = tot;  st[p[i]] = true; }int ans = 0;  for (int i = 1; i <= m; i ++ ){int k = p[i];for (int j = q[p[i]] - 1; j >= 1; j -- ) {ans += v[e[j]];q[e[j]] = j + 1;e[j + 1] = e[j];}e[1] = k, q[e[1]] = 1; }printf("%d", ans);return 0;
}