Codeforces Round #611 (Div. 3) 题解

A - Minutes Before the New Year
计 算 距 离 0 点 还 有 几 分 钟 , 全 部 化 成 分 钟 来 计 算 计算距离0点还有几分钟,全部化成分钟来计算 0

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	int T;
	cin >> T;
	while(T--){
		int a,b;cin >> a >> b;
		int ans = 24 * 60;
		if(a == 0 && b == 0) puts("0");
		else printf("%d\n",ans - a * 60 - b); 
	}
}

B - Candies Division
给你a,b,表示把b颗糖果分给a个人,这a个人的糖果之差最多为1并且相差人数最多只能为b/2个。那就判断a%b的余数和b/2相比进行讨论。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	int T;
	cin >> T;
	while(T--){
		int a,b;cin >> a >> b;
		int yu = a % b;
		if(yu <= b / 2) printf("%d\n",a);
		else printf("%d\n",a - abs(b / 2 - yu));
	}
}

C - Friends and Gifts
给你n个数,其中几个数为0,0可以修改为任何数。让你对0进行修改后使这个n个数成为一个第i个数不为i的排列。
你找出这剩下的要修改的几个数的值,从左往右依次放入,如果 i = = a [ i ] i == a[i] i==a[i],就从最后找一个数放到这个位置。如果最后一个数 i = = a [ i ] i == a[i] i==a[i],那就在前面的0的位置找一个交换就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 100;
int a[maxn];
set<int>s;
vector<int>ans;
int main(){
	int n;cin >> n;
	for(int i = 1;i <= n;i++) cin >> a[i],s.insert(i);
	for(int i = 1;i <= n;i++) if(a[i] != 0) s.erase(a[i]);
	for(int i = 1;i <= n;i++) {
		if(a[i] != 0) ans.push_back(a[i]);
		else {
			if(i == *s.begin() && i != *--s.end()) ans.push_back(*--s.end()),s.erase(--s.end()); 
			else if(i != *s.begin())ans.push_back(*s.begin()),s.erase(s.begin());
	 	else{
				ans.push_back(*s.begin());
				s.erase(--s.end());
				for(int j = 1;j <= n;j++){
					if(i == j)continue;
					if(a[j] == 0) {
						swap(ans[i - 1],ans[j - 1]);
						break;
					}
				}
			}
		}
	}
	for(auto it : ans) printf("%d ",it);
}

D - Christmas Trees
给你n个点的位置a[i],让你求放m个点b[j],是的距离之和最小。
距离的定义为这个m个点到这n个点中任意一个点的距离。
我们就对这个m个点做一个bfs即可,用map标记vis;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 100;
int n,m;
int t[maxn];
vector<int>ans;
map<int,int>vis;
struct node{
	int pos,step;
}a,b;
int main(){
	vis.clear();
	queue<node>q;
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		cin >> t[i];a.pos = t[i];a.step = 0;
		q.push(a);vis[t[i]] = 1;
	}
	long long len = 0;
	for(int i = 1;i <= m;i++){
		a = q.front();q.pop();
		while(vis[a.pos] == 1){
			b.pos = a.pos + 1;b.step = a.step + 1;
			if(!vis[b.pos]) q.push(b);
			b.pos = a.pos - 1;b.step = a.step + 1;
			if(!vis[b.pos]) q.push(b);
			a = q.front(),q.pop();
		}
		ans.push_back(a.pos);vis[a.pos] = 1;
		len += a.step;	
		b.pos = a.pos + 1;b.step = a.step + 1;
		if(!vis[b.pos]) q.push(b);
		b.pos = a.pos - 1;b.step = a.step + 1;
		if(!vis[b.pos]) q.push(b);
	}
	printf("%lld\n",len);
	for(auto it : ans) printf("%d ",it);
} 

E - New Year Parties
给你n个数,这n个数可以左移或右移1个单位,问你n个数覆盖的数的最多个数和最小个数。
最小个数很好求,连续的三个数我可以移到一起。
最多的个数呢,对于在这个位置上个数大于1的我从左往右遍历右移一个单位,再对于在这个位置上个数大于1的我从右往左遍历左移一个单位,然后统计出现的位置的个数即为最大。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 100;
int minn[maxn],maxx[maxn];
int main(){
	int a;
	int n;cin>>n;for(int i=1;i<=n;i++)cin>>a,minn[a]++,maxx[a]++;
	for(int i = 1;i <= n;i++){
		if(maxx[i] > 1) maxx[i]--,maxx[i + 1]++;
	}
	for(int i = n;i >= 1;i--){
		if(maxx[i] > 1) maxx[i]--,maxx[i - 1]++;
	}
	int Max = 0,Min=0;
	for(int i = 0;i <= n + 1;i++){
		if(maxx[i] > 0) Max++;
	}
	for(int i = 1;i <= n;){
		if(minn[i]){
			Min++;i+=3;
		}
		else i++;
	}
	printf("%d %d\n",Min,Max);
}

F DIY Garland
留坑 待补。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值