CF349B

题目链接

    题目大意: Igor 深深爱上了Tanya. 现在, Igor想表达他的爱意, 他便在Tanya家对面的墙上写下一串数字. Igor认为, 数字越大, Tanya接受他的机会就越大(Ps:恋爱中的人智商为负). 不幸的是, 他只有v升油漆, 每个数字都会花掉一定的油漆(ai:数i花掉的油漆). Igor不喜欢0所以数中不会出现0(1..9). 问Igor能得到的最大的数是多少.


    思路: 刚看完题目时以为是个背包, 然后去寻找状态去了(找啊找, 找啊找), 额又智障了...
    跳出了背包这个思路以后. 仔细想了想, 怎么让这个数最大.
        1. 位数---毫无疑问位数越多数越大, 所以我们每次操作都不能使位数减少.
        2. 在这个基础上我们想要每次操作的数尽可能的大.
    咦, 那尝试一下贪心···

伪代码:

    WHILE (V is valid)
        找出满足条件一的所有数
        选择其中最大的并更新V

代码实现:
利用优先队列来求出最大数(注意, 使用优先队列前因将其清空)
数字可能很大, 于是用字符串处理

#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

int v, t, min_cost = 100001;
int ans[10], cost[10];
char out[10000000];
priority_queue<int> que;
int cnt = 0;
int main()
{
    scanf("%d", &v);
    for ( int i = 0; i < 9; i ++ )
    {
        scanf("%d", cost + i);
        min_cost = min(min_cost, cost[i]);
    }

    while ( v > 0 )
    {
        t = v / min_cost;
        if ( t == 0 )   break;

        while ( !que.empty() )  que.pop();

        for ( int i = 0; i < 9; i ++ )
            if ( ( v - cost[i] ) / min_cost == t - 1 && v >= cost[i]  )
                que.push(i);

        if ( !que.empty() )
        {
            t = que.top();
            ans[t] ++;
            v -= cost[t];
        }
    }
    for ( int i = 8; i >= 0; i -- )  while ( ans[i] -- )     out[cnt++] = '1' + i;

    if ( cnt == 0 ) printf("-1\n");
    else
    {
        out[cnt] = '\0';
        printf("%s\n", out);
    }
    return 0;
}
### 关于 Codeforces Problem CF175B 的解决方案 #### 问题描述 Codeforces Problem CF175B 是一个涉及路径规划和字符串操作的问题。题目要求设计一个机器人程序,使其能够按照给定的指令完成特定的任务。 虽然当前未提供具体题目的详细说明,但从常见的机器人路径问题来看,通常会涉及到以下几个方面: - **输入解析**:读取机器人的初始位置以及目标位置。 - **路径计算**:通过分析可能的方向变化来构建最短路径。 - **输出生成**:将路径转换为一系列字符表示的动作序列。 以下是基于常见机器人路径问题的一个通用解决框架[^3]: --- #### 解决方案概述 为了实现该问题的目标,可以采用如下策略: 1. 定义方向向量 `dx` 和 `dy` 来表示上下左右四个移动方向。 2. 使用广度优先搜索(BFS)算法找到从起点到终点的最短路径。 3. 将 BFS 路径转化为对应的命令字符串形式。 下面是具体的代码实现示例: ```cpp #include <bits/stdc++.h> using namespace std; const int MAX_N = 100; char grid[MAX_N][MAX_N]; bool visited[MAX_N][MAX_N]; // 方向定义 struct Direction { int dx, dy; char command; }; Direction directions[] = {{0, 1, &#39;R&#39;}, {0, -1, &#39;L&#39;}, {1, 0, &#39;D&#39;}, {-1, 0, &#39;U&#39;}}; int num_directions = sizeof(directions) / sizeof(directions[0]); void bfs(int startX, int startY, int endX, int endY, vector<char>& path) { queue<pair<int, pair<int, string>>> q; // (current_x, current_y), commands_so_far q.push({startX, {startY, ""}}); visited[startX][startY] = true; while (!q.empty()) { auto front = q.front(); q.pop(); int cx = front.first; int cy = front.second.first; string cmd = front.second.second; if (cx == endX && cy == endY) { for (auto c : cmd) path.push_back(c); return; } for (int i = 0; i < num_directions; ++i) { int nx = cx + directions[i].dx; int ny = cy + directions[i].dy; if (nx >= 0 && nx < MAX_N && ny >= 0 && ny < MAX_N && !visited[nx][ny] && grid[nx][ny] != &#39;#&#39;) { visited[nx][ny] = true; q.push({nx, {ny, cmd + directions[i].command}}); } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; pair<int, int> start, finish; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> grid[i][j]; if (grid[i][j] == &#39;S&#39;) start = {i, j}; if (grid[i][j] == &#39;E&#39;) finish = {i, j}; } } memset(visited, false, sizeof(visited)); vector<char> resultPath; bfs(start.first, start.second, finish.first, finish.second, resultPath); cout << resultPath.size() << "\n"; for (auto c : resultPath) cout << c; cout << "\n"; return 0; } ``` 上述代码实现了以下功能: - 利用 BFS 寻找从起点到终点的最短路径。 - 输出路径长度及其对应的操作序列。 --- #### 复杂度分析 - 时间复杂度:O(N * M),其中 N 表示网格的高度,M 表示宽度。这是由于 BFS 需要遍历整个地图一次。 - 空间复杂度:O(N * M),用于存储访问状态矩阵和队列中的节点信息。 --- #### 注意事项 如果实际问题中有额外约束条件,则需调整 BFS 或增加剪枝逻辑以优化性能。例如,在某些情况下,可以通过启发式函数改进搜索效率(A* 算法)。此外,还需注意边界情况处理,比如无法到达目的地的情形应返回特殊标志或错误提示[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值