P8467 [Aya Round 1 B] 甲(one)

甲(one)

题目描述

定义长度为 5 5 5 的序列 S S S 为「好的」,当且仅当存在长度为 5 5 5 的排列 P P P,满足 S P 1 − 1 = S P 2 = S P 3 + 1 S_{P_1}-1=S_{P_2}=S_{P_3}+1 SP11=SP2=SP3+1 S P 4 = S P 5 S_{P_4}=S_{P_5} SP4=SP5。现有一长度为 5 5 5 的整数序列 a a a,满足 0 ≤ a i ≤ 9 ( 1 ≤ i ≤ 5 ) 0\le a_i \le 9(1\le i \le 5) 0ai9(1i5)。其中 a 1 ∼ a 4 a_1 \sim a_4 a1a4 给定。试判断是否存在 a 5 a_5 a5 满足 a a a 为「好的」。

其中,长度为 5 5 5 的排列 P P P,指的是一个长度为 5 5 5 的数列,其中 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 在这个数列中出现且只出现一次。

输入格式

本题含有多组数据。

  • 第一行输入一个整数 T T T 代表数据组数。
  • 接下来 T T T 行每行输入四个整数 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4。表示一组数据。

输出格式

  • 输出共 T T T 行。对于每组数据,若存在满足条件的 a 5 a_5 a5,输出 1 1 1;否则输出 0 0 0

样例 #1

样例输入 #1

5
3 2 8 4
1 2 3 4
1 9 4 9
1 0 0 1
0 0 4 2

样例输出 #1

1
1
0
0
1

提示

附加样例

  • 样例 2 2 2 见下发文件中的 one2.in/one2.ans \text{one2.in/one2.ans} one2.in/one2.ans。该样例满足测试点 2 2 2 的限制。
  • 样例 3 3 3 见下发文件中的 one3.in/one3.ans \text{one3.in/one3.ans} one3.in/one3.ans。该样例满足测试点 5 5 5 的限制。

样例解释

样例 #1
  • 对于第 1 1 1 组数据,可以令 a 5 = 8 a_5=8 a5=8。此时存在 P = { 2 , 1 , 4 , 5 , 3 } P=\{2,1,4,5,3\} P={2,1,4,5,3},满足 a P 1 − 1 = a P 2 = a P 3 + 1 a_{P_1}-1=a_{P_2}=a_{P_3}+1 aP11=aP2=aP3+1 a P 4 = a P 5 a_{P_4}=a_{P_5} aP4=aP5。故输出 1 1 1
  • 对于第 2 2 2 组数据,可以令 a 5 = 4 a_5=4 a5=4。此时存在 P = { 1 , 2 , 3 , 4 , 5 } P=\{1,2,3,4,5\} P={1,2,3,4,5},满足 a P 1 − 1 = a P 2 = a P 3 + 1 a_{P_1}-1=a_{P_2}=a_{P_3}+1 aP11=aP2=aP3+1 a P 4 = a P 5 a_{P_4}=a_{P_5} aP4=aP5。故输出 1 1 1
  • 对于第 3 3 3 组数据,不存在可以使 a a a 为「好的」的 a 5 a_5 a5

数据范围

KaTeX parse error: \hline valid only within array environment

  • 特殊性质 A \bf A A a 1 = a 2 = a 3 = a 4 a_1=a_2=a_3=a_4 a1=a2=a3=a4
  • 特殊性质 B \bf B B a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4 互不相等。

对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 1 0 5 1\le T\le 10^5 1T105 0 ≤ a i ≤ 9 0\le a_i \le 9 0ai9

思路

首先读入四个数字,记录每一个数字的出现次数。

若某个数字重复出现则满足 $ S_{P_4} = S_{P_5} $ 的条件,标记 $ flag=1 $ ,并将这个数字出现的次数清零。

  • 若 $ flag==1 $ :

  • 则枚举 $ 1 $ 至 $ 8 $ 的数字 $ i $ ,判断 数字 $ i-1 $ 和 $ i $ , $ i+1 $ 是否有两个数出现过,若存在则标记 $ flag=2 $ 并退出循环 ,若 $ flag==1 $ 则输出 $ 0 $ 否则输出 $ 1 $。

  • 若 $ flag==0 $ :

  • 首先对四个数排序(按从小到大排序)。

  • 若 $ a_1 = a_2 -1 , a_2 = a_3 -1 $ ,则最后一个数一定是 $ a_4 $ 。

  • 若 $ a_2 = a_3 -1 , a_3 = a_4 -1 $ ,则最后一个数一定是 $ a_1 $ 。

  • 否则输出 $ 0 $ 。

$ code $

#include
using namespace std;
namespace Solve
{
    inline int read()
	{
		int x=0,f=1;
		char ch=getchar();
		while(!isdigit(ch))
		{
			if(ch=='-')f=-f;
			ch=getchar();
		}
		while(isdigit(ch))
		{
			x=(x<<3)+(x<<1)+ch-'0';
			ch=getchar();
		}
		return x*f;
	}
    map < int , int > mp;
    int T;
    int a[6];
    void work()
    {
        cin>>T;
        while(T--)
        {
            mp.clear();
            int flag=0,ans;
            for(int i=1; i<=4; i++)
            {
                cin>>a[i];
                mp[a[i]]++;
                if(mp[a[i]]==2)
                {
                    flag=1;
                    mp[a[i]]=0;
                }
            }
            if(flag==1)
            {
                for(int i=1; i<9; i++)
                {
                    if(mp[i-1]+mp[i]+mp[i+1]==2)
                    {
                        flag=2;
                        cout<<1<<endl;
                        break;
                    }
                }
                if(flag==1)cout<<0<<endl;
            }
            else
            {
                sort(a+1,a+4+1);
                if(a[1]+1==a[2]&&a[2]==a[3]-1)
                {
                    cout<<1<<endl;
                }
                else
                if(a[2]+1==a[3]&&a[3]==a[4]-1)
                {
                    cout<<1<<endl;
                }
                else cout<<0<<endl;
            }
            
        }
    }
}
int main()
{
    Solve::work();
}

你可能感兴趣的:(题解,c++)