A - Good morning
题意: 某一天,高桥在A点整(24小时制)的B分钟起床,而青木在C点整的D分钟和1秒起床。如果高桥比青木早起床,打印“高桥”;否则,打印“青木”。
思路:就是判断A * 60 + B 和 C * 60 + D 的大小
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 200010;
int a, b, c, d;
int main()
{
cin >> a >> b >> c >> d;
if(a * 60 + b > c * 60 + d)
{
cout << "Aoki";
}
else
{
cout << "Takahashi";
}
return 0;
}
B - Mex
题意:给定一个由整数组成的长度为N的序列:A=(A1,…,AN)。找到不在(A1,…,AN)中的最小非负整数。
思路:用一个数组统计数字出现次数,然后从0开始寻找这个序列中未出现的最小自然数。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2010;
int n;
int cnt[N];
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
int x;
cin >> x;
cnt[x] ++;
}
for(int i = 0 ; ; i ++)
{
if(!cnt[i])
{
cout << i;
return 0;
}
}
return 0;
}
C - Choose Elements
题意:给定两个整数序列,每个序列的长度为N:A=(A1,…,AN)和B=(B1,…,BN)。判断是否存在一个长度为N的序列X=(X1,…,XN),满足以下条件:对于每个i(1≤i≤N),有Xi=Ai或Xi=Bi。对于每个i(1≤i≤N-1),有|Xi-Xi+1| ≤ K。
思路:如果对于每个i(1≤i≤n-2)都满足以上要求,那么显然此时是否满足要求只与an-1, an, bn-1, bn有关。这种性质满足无后效性,考虑使用动态规划。
我们设有dp[i][2]:
若dp[i][0]=0表示第ai可用
若dp[i][0]=1表示第ai不可用
若dp[i][1]=0表示第bi可用
若dp[i][1]=1表示第bi不可用
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 200010;
int a[N], b[N];
int n, k;
int dp[N][2];
int main()
{
cin >> n >> k;
for(int i = 1 ;i <= n ;i ++) cin>>a[i];
for(int i = 1 ;i <= n ;i ++) cin>>b[i];
for(int i = 2 ;i <= n ;i ++)
{
if(!dp[i - 1][0] && abs(a[i] - a[i - 1]) <= k || !dp[i - 1][1] && abs(a[i] - b[i - 1]) <= k) dp[i][0] = 0;
else dp[i][0] = 1;
if(!dp[i - 1][0] && abs(b[i] - a[i - 1]) <= k || !dp[i - 1][1] && abs(b[i] - b[i - 1]) <= k) dp[i][1] = 0;
else dp[i][1] = 1;
}
if(!dp[n][0]||!dp[n][1]) cout << "Yes";
else cout << "No";
return 0;
}