Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3)

来源:互联网 发布:java中反射的应用 编辑:程序博客网 时间:2024/06/05 05:55

A

#include <cstdio>#include <cstring>#include <cmath>#include <cctype>#include <iostream>#include <algorithm>#include <sstream>#include <queue>#include <stack>#include <set>#include <map>#include <vector>#include <utility>using namespace std;typedef long long ll;const int qq = 1e5 + 10;ll num[qq];int main(){int n, m, k; cin >> n >> m >> k;int x, y;int c = m*2;y = k%c == 0? k/c:k/c+1;char s;k = k%c == 0? c : k%c;if(k%2 == 0)x = k/2;else x = k/2 + 1;if(k%2 == 1)s = 'L';elses = 'R';cout << y << " " << x << " " << s << endl;return 0;}

B

题意:给出两个字符串a,b, 问能否通过字母的映射使得字符串b变成a

思路: 唯一的坑点就在与多重映射, 因为如果是字母a -> 字母a的话这样情况是不算一次映射的.

哈哈 fst的时候只过了700+     和我一起打的伙伴们都挂了  我就一个在哪里出力瑟瑟发抖

#include <cstdio>#include <cstring>#include <cmath>#include <cctype>#include <iostream>#include <algorithm>#include <sstream>#include <queue>#include <stack>#include <set>#include <map>#include <vector>#include <utility>using namespace std;typedef long long ll;const int qq = 1e5 + 10;string a, b;int str[1005];int o[1005];struct C{    char a, b;}num[1005];int main(){cin >> a >> b;int k =  0;bool f = true;memset(str, 0, sizeof(str));memset(o, 0, sizeof(o));for(int i = 0; i < (int)b.size(); ++i){if(str[b[i]])continue;o[a[i]]++;if(o[a[i]] >= 2)f = false;str[b[i]] = a[i];}if(!f){cout << -1 << endl;return 0;}for(int i = 0; i < (int)b.size(); ++i){if(!str[b[i]])continue;b[i] = str[b[i]];}int p = 0;if(a == b){for(int i = 0; i < 200; ++i)if(str[i]){            char q, w;            q = i, w = str[i];            if(q == w)continue;            if(q > w)swap(q, w);            bool flag = true;            for(int j = 0; j < p; ++j)            if(num[j].a == q && num[j].b == w)flag = false;            else if(num[j].a == q || num[j].b == w)f = false;            if(flag){             num[p].a = q, num[p].b = w;             p++;            }}if(!f){cout << -1 << endl;return 0;}        cout << p << endl;        for(int i = 0; i < p; ++i)            cout << num[i].a << " " << num[i].b << endl;}elsecout << "-1" << endl;return 0;}

C

题意:给出n次操作, 每次可以向上 向下 向左 向右走一个单位, 他每次都是从一个点走到另外一个点 并且走的一定是最短距离, 求一共进行了多少次这样的操作

思路:按照过程模拟即可 每次从始发地到目的地走最短距离, 那么也就是说每次走之后距离始发地越远则还在像目的地移动,  如果距离一旦减少, 说明走之前的点就是目的地, 然后更新事发地, 一直模拟下去即可

#include <cstdio>#include <cstring>#include <cmath>#include <cctype>#include <iostream>#include <algorithm>#include <sstream>#include <queue>#include <stack>#include <set>#include <map>#include <vector>#include <utility>using namespace std;typedef long long ll;const int qq = 2e5 + 10;typedef pair<ll, ll> pill;map<pill, int> Q;bool vis[qq];string s;ll dis;ll o1, o2;bool f(ll a, ll b){if(abs(a-o1)*abs(a-o1)+abs(b-o2)*abs(b-o2) > dis){dis = abs(a-o1)*abs(a-o1)+abs(b-o2)*abs(b-o2);return true;}return false;}int main(){ll n; cin >> n;ll x, y;x = y = 0;o1 = o2 = 0;dis = 0;cin >> s;int k = 0;for(int i = 0; i < n; ++i){        int xx = x, yy = y;if(s[i] == 'U')x = x + 1;else if(s[i] == 'D')x = x - 1;else if(s[i] == 'R')y = y + 1;else if(s[i] == 'L')y = y - 1;if(!f(x, y)){            dis = 1; Q[make_pair(xx, yy)] = 1;            k++;            o1 = xx; o2 = yy;}}k++;cout << k << endl;return 0;}


0 0
原创粉丝点击