A. Everyone Loves to Sleep
题目链接:
题面:
题意:
一个人设了n个闹钟,然后他在h:m的时候睡下去,闹钟响起来的时候起床,问能睡多久
思路:
我们可以把闹钟按时间从小到大排序,然后在第一个大于睡下去的闹钟响起的时候来计算差值,如果没有这个闹钟就用第一个闹钟+1440来计算差值
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[15];
int main(){
int t;
cin >> t;
while(t--){
int n, h, m;
int a;
cin >> n >> h >> m;
a = h * 60 + m;
for(int i = 0; i < n; i++){
cin >> h >> m;
arr[i] = h * 60 + m;
}
sort(arr, arr + n);
bool f = 0;
for(int i = 0; i < n; i++){
if(arr[i] >= a){
cout << (arr[i] - a) / 60 << " ";
cout << (arr[i] - a) % 60 << endl;
f = 1;
break;
}
}
if(!f){
cout << (arr[0] + 1440 - a) / 60 << " " << (arr[0] + 1440 - a) % 60 << endl;
}
}
return 0;
}
B. Remove Prefix
题目链接:
题面:
题意:
有n个数,你可以多次删除第一个数,问能否使删除后的数组中每个数只出现一次,求删除的数的数量
思路:
我们可以从后往前遍历,然后记录每个数字是否出现过,如果这个数已经出现过,那么这个数及前面的数都要删除
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[200005];
bool vis[200005];
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> arr[i];
vis[i]= 0;
}
bool f = 0;
for(int i = n; i >= 1; i--){
if(vis[arr[i]]){
f = 1;
cout << i << endl;
break;
}
vis[arr[i]] = 1;
}
if(!f){
cout << 0 << endl;
}
}
return 0;
}
C. Minimum Varied Number
题目链接:
题面:
题意:
有一个数n,求拆成字典序最小的多个数之和,每个数只能出现一次
思路:
如果这个数小于10,那么就是本身,否则我们就按9.8.7的顺序依次递减,直到剪不了了为止
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
if(n < 10){
cout << n << endl;
}else{
int a = 9;
string s = "";
while(n >= a && n && a){
s = char(a + '0') + s;
n -= a;
a--;
}
if(n){
s = char(n + '0') + s;
}
cout << s << endl;
}
}
return 0;
}
E. Add Modulo 10
题目链接:
题面:
题意:
有n个数,每个数可以多次累加取模10后的值,问能否使所有数都相同
思路:
0 0 0 0 0 0
1 2 4 8 6 2
2 4 8 6 2 4
3 6 2 4 8 6
4 8 6 2 4 8
5 0 0 0 0 0
6 2 4 8 6 2
7 4 8 6 2 4
8 6 2 4 8 6
9 8 6 2 4 8
这是每个个数数多次累加的结果
可以得出0,5可互相转换,其他可以互相转换,而且2转换到下一个2会加20
所以这些不能既含0,5,也含其他
如果只含0,5,就全转换为个位为0,判断是否相同
如果只含其他就转换为个位为2,看十位以上的奇偶性是否相同
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[200005];
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
int a = 0;
for(int i = 0; i < n; i++){
cin >> arr[i];
if(arr[i] % 10 == 0 || arr[i] % 10 == 5){
a++;
}
}
if(a != n && a != 0){
cout << "No" << endl;
}else if(a == n){
bool f = 0;
for(int i = 0; i < n; i++){
while(arr[i] % 10 == 5){
arr[i] += 5;
}
if(i != 0 && arr[i] / 10 != arr[i - 1] / 10){
cout << "No" << endl;
f = 1;
break;
}
}
if(!f){
cout << "Yes" << endl;
}
}else{
bool f = 0;
for(int i = 0; i < n; i++){
while(arr[i] % 10 != 2){
arr[i] += arr[i] % 10;
}
if(i >= 1){
int ans = arr[i] / 10;
int cnt = arr[i - 1] / 10;
if(ans % 2 != cnt % 2){
f = 1;
cout << "No" << endl;
break;
}
}
}
if(!f){
cout << "Yes" << endl;
}
}
}
return 0;
}