Acwing第72场周赛
第一题:AcWing 4624. 最小值
分析:向下取整可以用到math.h头文件中的floor()函数,最后输出时套用两个min()函数求三个数的最小值即可。
代码:
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int main(){
int a,b;
int T;
cin >> T;
while(T --){
scanf("%d%d",&a,&b);
int c = floor((a + b)/3);
cout << min(a,min(b,c)) << endl;
}
return 0;
}
分析:要使得压缩次数最小,所有必须要使每次压缩的体积变化最大,即 a - b 最大,用一个数组w[ ] 存储不同文件压缩前后体积变化的值,对数组进行降序排序,判断所有文件原体积的和sum是否小于m,若小于则直接输出0,若sum>m,则sum依次减去w[ ]数组中的值,直至 sum<m 时停止循环。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, m;
int w[N];
int main()
{
scanf("%d%d", &n, &m);
LL sum = 0;
for (int i = 0; i < n; i ++ )
{
int a, b;
scanf("%d%d", &a, &b);
sum += a;
w[i] = a - b;
}
sort(w, w + n, greater<int>());
if (sum <= m) puts("0");
else
{
for (int i = 0; i < n; i ++ )
{
sum -= w[i];
if (sum <= m)
{
printf("%d\n", i + 1);
return 0;
}
}
puts("-1");
}
return 0;
}
Leetcode第314场周赛
分析:此数组是一个严格递增的序列,用vector数组tt记录作差后较大的值以及最大值所对应的下标,遇到完成时间相同的员工要记录更小的id。
代码:
class Solution {
public:
int hardestWorker(int n, vector<vector<int>>& logs) {
int m = logs.size();//一共有m个员工,不是题中的n
vector<int> tt;
tt.push_back(logs[0][1]);
for(int i = 1 ; i < m; i ++)
{
int t = logs[i][1] - logs[i - 1][1];
tt.push_back(t);
}
int t = 0;
int id = 0;
for(int i = 0 ; i < m; i ++)
{
if(tt[i] > t)
{
t = tt[i];
id = logs[i][0];
}
else if(tt[i] == t)//出现有相等情况保存id较小的那一个
{
id = min(id , logs[i][0]);
}
}
return id;
}
};
分析:
根据公式变形可得:
perf[i] = ans[0] ^ ans[1]...^ ans[i - 1] ^ ans[i];
perf[i - 1] = ans[0] ^ ans[1]...^ ans[i - 1];
perf[i] ^ perf[i - 1] = ans[i]
代码:
class Solution {
public:
vector<int> findArray(vector<int>& pref) {
int len = (int)pref.size();
vector<int> ans(len);
ans[0] = pref[0];
for(int i = 1; i < len; i++) {
ans[i] = pref[i] ^ pref[i - 1];
}
return ans;
}
};