UVA10881 Piotr‘s Ants

难度:5
知识点:模拟

这是一道大水题,因为洛谷的1367和这道题一模一样,难度标的是3,结果在uva,难度居然是5,就因为题目全是英语,直接提升两个档次?不过这道题有额外一个坑点,就是要longlong,结果超会int,

首先这就是喜闻乐见的蚂蚁题,那么肯定不能一个一个模拟,只能让它们互相穿过去,不然怎么做嘛,输入的时候给出每个蚂蚁的位置,输出的时候要我们还是按照输入的顺序输出每个蚂蚁的位置,有个结论,那就是每个蚂蚁的位置可能会改变,但是它的相对位置不会改变,所以就让每个蚂蚁都无视碰撞规则向前走,然后在按照输入得到的想对位置关系,找它们是拿个蚂蚁,

具体的做法就是输入的时候存一下这个位置是第几号蚂蚁,然后排序,从左到右遍历,开个数组记录一下有序情况下每个位置是输入的第几号蚂蚁,同时模拟蚂蚁向前走,然后接着排序,此时蚂蚁走完,还是有序情况下从前向后遍历,之前开的数组里面记录的就是排名第几的蚂蚁在输入的排名,其实就是记录的下标,开另外一个结构体数组记录一下答案,最后就是遍历输出,输入带输出总共四次循环,好像只能这样做了

还有一点要注意,左端点是0不是1,

#include <bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;

const int N = 1e5 + 5;

struct student {
    ll x, r;
    char ch;
} stu[N], ans[N];

int Rank[N];

bool cmp(student a, student b) {
    return a.x < b.x;
}

int main() {
    int tt;
    cin >> tt;
    int Case = 1;
    while (tt--) {
        ll l, t;
        int n;
        cin >> l >> t >> n;
        for (int i = 0; i < n; i++) {
            cin >> stu[i].x >> stu[i].ch;
            stu[i].r = i;
        }
        sort(stu, stu + n, cmp);
        map<ll, int> mp;
        for (int i = 0; i < n; i++) {
            Rank[i] = stu[i].r;
            if (stu[i].ch == 'L') stu[i].x -= t;
            if (stu[i].ch == 'R') stu[i].x += t;
            if (mp.find(stu[i].x) == mp.end()) mp[stu[i].x] = 1;
            else mp[stu[i].x]++;
        }
        sort(stu, stu + n, cmp);
        for (int i = 0; i < n; i++) {
            ans[Rank[i]] = stu[i];
        }
        cout << "Case #" << Case++ << ":\n";
        for (int i = 0; i < n; i++) {
            if (ans[i].x > l || ans[i].x < 0) cout << "Fell off";
            else {
                cout << ans[i].x << " ";
                if (mp[ans[i].x] == 1) cout << ans[i].ch;
                else cout << "Turning";
            }
            cout << endl;
        }
        cout << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值