题解分享
题解分享简介
卡牌(编程题) - 题解
贪心: 每次对最少的牌进行+1 (使用小跟堆可以快速得到元素最小值)
退出条件: m == 0|| 超过 $b_i$ 次
```cpp
#include <cstdio>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
int main() {
int n, m;
scanf("%d %d", &n, &m);
vector<int> brr(n);
priority_queue<tuple<int, int>, vector<tuple<int, int>>, greater<tuple<int, int>>> pq; // 数量 - 索引
for (int i = 0, j; i < n; ++i) {
scanf("%d", &j);
pq.push(make_tuple(j, i));
}
for (int i = 0; i < n; ++i) {
scanf("%d", &brr[i]);
}
while (m--) {
int cnt, i;
tie(cnt, i) = pq.top();
pq.pop();
if (--brr[i] < 0 || !m) {
printf("%d\n", cnt);
return 0;
}
pq.push(make_tuple(++cnt, i));
}
return 0;
}
```
查看全文
1
0
1
4
卡牌(编程题) - 题解
暴力做法 网站数据比较少竟然所有数据都过了每次都画最少的那张
```
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct point{
int m_min;
int cnt;
}point;
int main(){
int n,m;
cin>>n>>m;
bool flage[n+10]={false};
int arr[n+10]={0};
point m_min={100000,0};
for(int i=1;i<=n;i++){
cin>>arr[i];
if(m_min.m_min>arr[i]){
m_min.m_min=arr[i];
m_min.cnt=i;
}
}
int brr[n+10]={0};
for(int i=1;i<=n;i++)
{
cin>>brr[i];
}
for(int i=1;i<=m;i++){
if(brr[m_min.cnt]>0)
{
arr[m_min.cnt]++;
brr[m_min.cnt]--;
m_min.m_min=100000;
}else{
flage[i]=true;
}
for(int j=1;j<=n;j++){
if(m_min.m_min>arr[j]&&!flage[j]){
m_min.m_min=arr[j];
m_min.cnt=j;
}
}
// cout<<m_min.m_min<<endl;
// cout<<m_min.cnt<<endl;
}
cout<<m_min.m_min<<endl;
return 0;
}
```
查看全文
0
0
0
4



