A. Rudolph and Cut the Rope
题意:有n个钉子钉在墙上,第ii个钉子离地面ai米高,有一根bi米长的绳子系在它上面。所有钉子按照从上到下不同的高度依次悬挂。一颗糖果同时系在所有绳子的另一端。为了拿到糖果,你需要把它放到地面上。为了做到这一点,Rudolph可以逐个剪断一些绳子。帮助Rudolph计算最小的必须剪断的绳子数量来取得糖果。
思路:如果ai > bi,此时的糖果就不可以到地上,因此只需要考虑ai > bi即可
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200010 , INF = 0x3f3f3f3f , Mod = 998244353;
int t;
int n, a, b, ans;
int main()
{
cin >> t;
while(t --)
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a >> b;
if(a > b) ans ++;
}
cout << ans << endl;
ans = 0;
}
return 0;
}
B. Rudolph and Tic-Tac-Toe
题意:Rudolph发明了一个三人玩的井字棋游戏。它有经典规则,除了第三个玩家使用加号符号来玩。Rudolph有一个3×3的棋盘——已完成的游戏结果。每个格子上可以是叉、圈、加号或者没有任何标记。游戏由在水平、垂直或对角线上形成3个相同符号的玩家获胜。Rudolph想要找出游戏的结果。要么仅有一个玩家获胜,要么以平局结束。保证不会出现多个玩家同时获胜。
思路:依次判断3行,3列,两个对角线上的元素是否相同,如果相同并且不是’.',那么就说明那个元素获胜,否则平局。
AC代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool checkRow(vector<string>& board, char player)
{
for (int i = 0; i < 3; i++)
{
if (board[i][0] == player && board[i][1] == player && board[i][2] == player)
{
return true;
}
}
return false;
}
bool checkColumn(vector<string>& board, char player) {
for (int i = 0; i < 3; i++) {
if (board[0][i] == player && board[1][i] == player && board[2][i] == player) {
return true;
}
}
return false;
}
bool checkDiagonal(vector<string>& board, char player) {
if (board[0][0] == player && board[1][1] == player && board[2][2] == player) {
return true;
}
if (board[2][0] == player && board[1][1] == player && board[0][2] == player) {
return true;
}
return false;
}
bool checkWin(vector<string>& board, char player) {
if (checkRow(board, player) || checkColumn(board, player) || checkDiagonal(board, player)) {
return true;
}
return false;
}
bool checkDraw(vector<string>& board) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == '.') {
return false;
}
}
}
return true;
}
string getGameResult(vector<string>& board)
{
if (checkWin(board, 'X'))
{
return "X";
}
if (checkWin(board, 'O'))
{
return "O";
}
if (checkWin(board, '+'))
{
return "+";
}
if (checkDraw(board))
{
return "DRAW";
}
return "DRAW";
}
int main() {
int t;
cin >> t;
while (t--)
{
vector<string> board(3);
for (int i = 0; i < 3; i++)
{
cin >> board[i];
}
string result = getGameResult(board);
cout << result << endl;
}
return 0;
}
C. Rudolf and the Another Competition
题意:Rudolf报名参加了一场遵循ICPC规则的编程竞赛。根据规则,每解决一个问题,参赛者将获得1分,并且会产生与解决问题的时间相等的罚时。在最终排名中,得分最高的参赛者排名靠前,如果得分相同,则罚时较低的参赛者排名靠前。总共有n名参赛者报名参加比赛。Rudolf是参赛者编号为1的选手。已知将提出m个问题。比赛将持续h分钟。
一个强大的人工智能预测了ti,jii的值,表示第ii个参赛者解决第j个问题所需的时间。
Rudolf意识到解决问题的顺序将影响最终结果。例如,如果h = 120h ,并且解决问题的时间为[20, 15, 110],那么如果Rudolf按照以下顺序解决问题:
3, 1, 2,那么他只能解决第三个问题,得到1分和110罚时。
1, 2, 3,那么他将在开始后20分钟解决第一个问题,在20 + 15 35分钟后解决第二个问题,而没有时间解决第三个问题。因此,他将得到2分和20 + 35 = 5520 + 35 = 5520+35=55罚时。
2, 1, 3,那么他将在开始后15分钟解决第二个问题,在15 + 20 =35分钟后解决第一个问题,而没有时间解决第三个问题。因此,他将得到2分和15 + 35 =50罚时。
Rudolf想知道,如果每个参赛者按照人工智能的预测顺序最优解决问题,他将在比赛中获得什么名次。假设在得分和罚时相同时,Rudolf将取得最佳名次。
思路:一. 解题数目不同:题目多的排名靠前
二. 解题数目相同:
1.罚时不同:罚时低的靠前
2.罚时相同:Rudolf靠前
只需要结构体重载排序规则即可
AC代码:
#include <bits/stdc++.h>
#define int long long
#define yes cout << "YES" << endl;
#define no cout << "NO" << endl;
#define debug(s, x) cout << "#debug:(" << s << ")=" << x << endl;
using namespace std;
typedef struct node {
int num, min, c;
bool operator<(const node& w) const {
if (num != w.num) return num > w.num;
if (min != w.min) return min < w.min;
return c > w.c;
}
} node;
void solve() {
int n, m, h;
cin >> n >> m >> h;
vector<node> a(n + 1);
for (int i = 1; i <= n; i++) {
vector<int> b(m + 1);
for (int i = 1; i <= m; i++) cin >> b[i];
sort(b.begin() + 1, b.end());
int cnt = 0, sum = 0, cur = 0;
for (int i = 1; i <= m; i++) {
if (cur + b[i] <= h) {
cnt++;
cur += b[i];
sum += cur;
}
}
a[i] = {cnt, sum, 0};
// cout << "i=" << i<<" " << cnt << " " << sum << endl;
if (i == 1) a[i].c = 1;
}
sort(a.begin() + 1, a.end());
for (int i = 1; i <= n; i++) {
if (a[i].c == 1) {
cout << i << endl;
return;
}
}
}
int main() {
int _ = 1;
cin >> _;
while (_--) solve();
return 0;
}