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
留坑 待补。