首页 > 其他分享 >P2206题解

P2206题解

时间:2023-09-09 11:36:22浏览次数:43  
标签:help MIN int 题解 INT flag P2206

题目大意:

给定一些指令,计算需要多大的舞台。

这是一道大模拟!!!

只要遍历每次指令,然后判断是否摔倒,摔倒输出`-1`否则记录,最后求出面积就行了。

最后附上代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int xx[] = {-1, 0, 1, 0}, yy[] = {0, 1, 0, -1};//不同方向的x,y移动数量
 4 struct node {
 5   int y, x;
 6 } a[] = {{114514, 1919810}, {0, 0}, {0, 1}, {1, 0}, {1, 1}};//记录四只脚的位置
 7 int fx, miny = INT_MAX, minx = INT_MAX, maxy = INT_MIN, maxx = INT_MIN, n;
 8 bool flag = 1;
 9 string s;
10 int help(string s) {
11   int f = 1;//记录是那只脚
12   if (s[0] == 'F' && s[1] == 'R') {
13     f = 2;
14   } else if (s[0] == 'R') {
15     if (s[1] == 'L') {
16       f = 3;
17     } else {
18       f = 4;
19     }
20   }
21   if (s[2] == 'P') {
22     for (int i = 1; i <= 4; i++) {
23       int ny = a[f].y + a[i].x - a[f].x;
24       int nx = a[f].x + a[f].y - a[i].y;
25       a[i].y = ny, a[i].x = nx;
26     }
27     fx = (fx + 1) % 4;//记录方向(模4可保证不RE)
28   } else {
29     int m = 0;
30     if (s[2] == 'R') {
31       m = 1;
32     }
33     if (s[2] == 'B') {
34       m = 2;
35     }
36     if (s[2] == 'L') {
37       m = 3;
38     }
39     m = (m + fx) % 4;//记录方向(模4可保证不RE)
40     a[f].y += xx[m];
41     a[f].x += yy[m];//记录坐标
42     for (int i = 1; i <= 4; i++) {
43       if (f != i && a[f].y == a[i].y && a[f].x == a[i].x) {//判断是否会摔倒
44         return 0;//返回不行
45       }
46     }
47   }
48   for (int i = 1; i <= 4; i++) {
49     miny = min(miny, a[i].y);
50     maxy = max(maxy, a[i].y);
51     minx = min(minx, a[i].x);
52     maxx = max(maxx, a[i].x);//取最大值与最小值
53   }
54   return 1;//返回可以
55 }
56 int main() {
57   cin >> n;
58   for (int i = 1; i <= n; i++) {
59     cin >> s;
60     if (!(flag = help(s))) {//判断可行性
61       break;
62     }
63   }
64   if (flag) {//判断并输出
65     cout << (maxy - miny + 1) * (maxx - minx + 1);//计算面积
66   } else {
67     cout << -1;
68   }
69   return 0;//华丽的结束
70 }
Code

 

标签:help,MIN,int,题解,INT,flag,P2206
From: https://www.cnblogs.com/mouseboy/p/17689092.html

相关文章

  • CF1513C题解
    一道递推由于对于一个数x,可得x+10-x=10(废话)于是问题就变成了0+m次,然后x+m就变成0+x+m(还是废话)于是可以写一个递推。首先对于函数f(m)可分为m ≤9和m>9,然后可得出递推式结果为1或f(m-9)+f(m-10),所以我们可以直接求出结果再分解数位求值。最后贴上代码......
  • P2203题解
    题意给定一个环形01序列,每次变化时,对于每个位置,如果前一个值是1,则当前值翻转。求变化B次后的序列。思路由于B的值很大,所以如果对每一次变化进行模拟,效率非常低下。不难发现,每一次变化后的状态完全是由当前状态决定的,而N的范围很小,所以可能的状态总数2^N也不是很大......
  • CF812B题解
    康了康唯一的题解,说没必要用DP,我就给出DP的解法。这其实是道水题,唯一的坑是有可能楼上没有开的灯,坑了我们机房的一堆人(WAontest4),剩下的就是DP。我们用a[n][0],表示第n层的第一个房间,用a[n][1],表示第n层的最后一个房间。这里提供一个收集型的写法。所以可得状态转移......
  • CF1690E题解
    ##主要题意:有$n$个礼物,要两两合并,然后除以$k$最后求和最大。##思路:先加入每个数除以$k$的商(单独组成$k$的个数),然后全部$\bmod\k$存入数组,排序,最后双指针一个前一个后求两个余数可以大于等于$k$的两个礼物。##代码:```cpp#include<bits/stdc++.h>usingname......
  • CF1690C题解
    ##主要题意:>有$n$个任务,必须在$s_i$到$t_i$之间完成,求每个任务最大可以完成多久(优先前面的最大)。##思路>就拿一个变量记录当前时间,然后贪心选择$a[i].t$和$a[i+1].t$中的最小值,(应为至少也要给下一个任务留$1$的时间),最后做减法,输出即可。##代码>```cpp>#incl......
  • pytest运行警告问题解决:DeprecationWarning: pkg_resources is deprecated as an API
    前言最近在运行pytest的时候,经常出现这个警告DeprecationWarning:pkg_resourcesisdeprecatedasanAPISeehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimportiter_entry_points从警告上看是方法被弃用,肯定是因为新版弃用了旧版的语法。......
  • luogu P1419 题解
    题目链接description给定一个长度为\(n\)的序列(值域为\([-10^4,10^4]\))和正整数\(st,ed\)。求一个区间,使得其长度\(\in[st,ed]\)且平均值最大,输出平均值。\(1\leqn\leq10^5\)solution这里给出一个复杂度线性的做法。求出前缀和数组\(s\),答案相当于\(\max\limit......
  • 【题解】CF1830A Copil Copac Draws Trees
    你考虑对于每一条边打上时间标记,然后在树上DFS的时候维护一下以\(u\)为根的答案即可,然后将答案合并,反正很简单,看代码就懂。code:#include<bits/stdc++.h>usingnamespacestd;constintNN=2e5+8;intt,n;structEdge{ intto,next,val;}edge[NN<<1];inthead[......
  • 【题解】CF1854E Game Bundles
    你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\)显然是及其地大)。那关键是我们如何进行构造。我们很容易知道每个集合里面\(>30\)的数只有一个。所以我们可以在\([1,30]\)中随机\(a_i\),直到满足的组数恰好小于等于\(a_i\),添加的时候维护数组\(f_i......
  • 【题解】CF1854D Michael and Hotel
    交互题。考虑题意即为找到\(1\)所在内向基环树上的所有点。我们考虑我们怎么找到环上的点,我们考虑我们可以\(O(\logn)\)询问到一个环上的点,方法即为将\(k\)定为一个大数,然后二分点集。然后我们便可以在\(O(n\logn)\)的时间复杂度内找到所有环上的点(我们一会儿再讲怎......