Heng_Xin 题解分享 · 2024/5/23
卡牌(编程题) - 题解
贪心: 每次对最少的牌进行+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
sun_shineday 题解分享 · 2025/5/27
卡牌(编程题) - 题解
暴力做法 网站数据比较少竟然所有数据都过了每次都画最少的那张 ``` #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