Codeforces Round #811 (Div. 3)A.B.C.E

A. Everyone Loves to Sleep

题目链接:

Problem - A - Codeforces

题面:

题意:

一个人设了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

题目链接:

Problem - B - Codeforces

题面:

题意:

有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

题目链接:

Problem - C - Codeforces

题面:

题意:

有一个数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

题目链接:

Problem - E - Codeforces

题面:

题意:

有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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值