声控灯 (思维 / 分类判断) (智算之道初赛高校组第二场)

传送门

共 10 个测试点 每个测试点 10 分
每个测试点限时 1 秒 运行内存上限 512MB

小明正在上楼梯,当小明逐渐接近某层楼的时候,这层楼的声控灯检测到小明的脚步声便会亮起来,当小明逐渐远去的时候,声控灯由于一段时间内没检测到声音又会灭下去。

由于小明是匀速上楼的,而且他的速度把控得刚刚好,脚步声的音量也十分恰当,使得灯的亮灭呈现出这样的状态:他当前所在的楼层的声控灯是亮起的,他即将抵达的下一层楼的声控灯是亮起的,他刚刚离开的那层楼的声控灯也是亮起的。

现在你站在楼的外面,通过窗户看到了灯的亮灭状态,请推断小明现在在几楼?

输入格式
每个测试点包含以下内容:
第一行给出一个整数 T,表示接下来给出 T 组测试数据
每组测试数据包含两行
第一行包含两个数 n,m,表示这栋楼一共有 n 层,当前有 m 盏灯是亮起的,而其余灯都是熄灭的
第二行包含 mm 个整数,这些整数按照从小到大的顺序给出亮起的灯的序号
保证输入数据是符合实际情况的

输出格式
输出 TT 行,每行包含一个数字,按照输入的顺序依次给出每组测试数据的答案。如果答案不确定,请输出 −1

数据规模与约定
对于 50% 的数据,1≤T≤10,3≤n≤100,m=3
对于 100% 的测试点,1≤T≤1000,1≤n≤10^9,1≤m≤3

样例输入
2
5 3
1 2 3
5 2
1 2
样例输出
2
1

思路: 原理很简单,就分类判断一下即可(不过我比赛的时候忘了 n=2,m=2的时候也是无法确定位置的,awtcl)。

代码实现:

#include
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
using namespace std;
const int  inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll   mod = 1e9 + 7;
const int  N = 2e5 + 5;

int t, n, m, a[5];

signed main()
{
    IOS;

    cin >> t;
    while(t --){
       cin >> n >> m;
       for(int i = 1; i <= m; i ++) cin >> a[i];
       if(n == 1 && m == 1) cout << 1 << endl;
       if(n == 2) cout << -1 << endl;
       if(n > 2){
            if(m == 2){
                if(a[1] == 1 && a[2] == 2) cout << 1 << endl;
                else if(a[1] == n - 1 && a[2] == n) cout << n << endl;
                else cout << -1 << endl;
            }
            else if(m == 3) cout << a[2] << endl;
            else cout << -1 << endl;
       }
    }

    return 0;
}

你可能感兴趣的:(比赛&训练)