《看了受制了》第三天,6道题,合计16道题
2023年8月28日 受制了系列第三天
今天是牛客和ACWING的题
AcWing5135 奶牛用餐
题目理解
这个题目是,考察了优先队列的知识。我们可以用STL的priority_queue快速实现。然后输出的时间就是作比较。。。balabala
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
priority_queue<long long, vector<long long>, greater<long long>> q;
int n, k;
long long res[N];
int main()
{
cin >> n >> k;
long long now = 0;
for (int i = 0; i < k; i ++ ) q.push(0);
for(int i = 1; i <= n; i++)
{
long long s, t;
cin >> s >> t;
auto time = q.top();
q.pop();
long long end = max(s, time) + t;
q.push(end);
cout << end << endl;
}
return 0;
}
AcWing5132 奶牛照相
题目理解
该题目是个模拟的题目,我们需要找到最高的,和除了最高的那个以外最高的,找到这两个就可以了。
代码实现
#include<iostream>
using namespace std;
const int N = 2e5 + 10;
typedef long long ll;
int w[N], h[N], wh[N];
int n;
int main()
{
cin >> n;
int pw = 0;
int maxh = 0, semaxh = 0;
int flag_max = 0;
for(int i = 1; i <= n; i++)
{
cin >> w[i] >> h[i];
pw += w[i];
// 找到最高的
if(h[i] > maxh)
{
maxh = h[i];
flag_max = i;
}
}
// 找到除它意外最大的
for(int i = 1; i <= n; i++)
if(flag_max != i)
semaxh = max(semaxh, h[i]);
// 为了方便规范一下高度数组
for(int i = 1; i <= n; i++)
if(i != flag_max)
wh[i] = maxh;
else
wh[i] = semaxh;
// 输出答案
for(int i = 1; i <= n; i++)
{
if(i != flag_max)
cout << (pw - w[i]) * wh[i] << " ";
else
cout << (pw - w[i]) * wh[i] << " ";
}
return 0;
}
牛客小白月赛76期 猜拳游戏
题目理解
就是推导出来它给啥输出啥就行。
代码实现
#include<iostream>
using namespace std;
int main()
{
string a;
cin >> a;
cout << a;
return 0;
}
牛客小白月赛76期 Kevin喜欢一
题目理解
就求出2的k次方大于等于n, 输出k即可。
代码实现
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
int res = 0;
long long k;
cin >> k;
long long q = 1;
while(q < k)
q *= 2, res++;
cout << res << endl;
}
return 0;
}
牛客小白月赛76期 A加B,A模B
题目理解
这个题从数学的逻辑上来推道,这个a和b肯定是1~n之间的数,那么又因为a % b == m那么这个m一定会小于等于n / 2。那么这样的话,就会得到a和b为m 和 n - m,如果 m >= n / 2则无解。这个时候我们便可得出答案了。
题目坑
我们不能写m >= n / 2有精度的问题,我们要写 m * 2 >= n
代码实现
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int T;
cin >> T;
while(T -- )
{
long long n, m;
scanf("%lld%lld", &n, &m);
if(m * 2 >= n )
{
cout << -1 << endl;
}else
cout << m << " " << n - m << endl;
}
return 0;
}
牛客小白月赛76期 MoonLight的运算问题
题目理解
只要x <= 1或者ai <= 1就加,不然就乘。但是要注意取模的时候。
代码实现
#include<iostream>
using namespace std;
using namespace std;
const int mod=998244353;
const int N=1e6+5,M=5e3+5;
typedef long long ll;
int main()
{
ll t;
t=1;
cin>>t;
while(t--)
{
ll n;
cin>>n;
ll x=0;
ll flag=0;
for(ll i=1;i<=n;i++)
{
ll tmp;
cin >> tmp;
if(x>=mod)flag=1,x%=mod;
if(flag==0)
{
if(x <= 1 || tmp <= 1)x=x+tmp;
else x=x*tmp;
}
else
{
if(tmp==1||tmp==0)x=(x+tmp)%mod;
else x=(x*tmp)%mod;
}
}
if(x>=mod)x%=mod;
cout<<x<<endl;
}
return 0;
}

浙公网安备 33010602011771号