Codeforces Round #767 (Div. 2)
A. Download More RAM
题目描述: 给你两个长度为n的数组a,b,再给你一个初始值k,你可以使用数组b增加k的值,但前提是你当前的k要大于等于将要使用的数组b对应元素的下标,问k最大能到多少。
思路: 比较明显的贪心,将两个数组捆绑然后按照a从小到大排序,然后模拟即可。
时间复杂度:O(nlogn)
** 代码**
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define PII pair<int, int> #define x first #define y second const int maxn = 1e6 + 10; const int INF = 0x3f3f3f3f; bool cmp(pair<int, int> a, pair<int, int> b) { return a.second < b.second; //从小到大排序 } const ll M = 11092019; const int N = 100010; int a[N][3]; struct node { int a; int b; bool operator <(node &M) { return a<M.a; } }s[N]; int main() { int t;cin>>t; while(t--){ int n,k;cin>>n>>k; for(int i=0;i<n;i++){ cin>>s[i].a; } for(int i=0;i<n;i++){ cin>>s[i].b; } sort(s,s+n); for(int i=0;i<n;i++) { if(k>=s[i].a) k+=s[i].b; else break; } cout<<k<<endl; } return 0; }
B. GCD Arrays
题目描述:
给定一个排列a,元素范围为[lr , rs],再给你一个整数k,你可以执行下列操作不超过k次:
从a中取出两个元素
将两数相乘
将乘积插入原数组的末尾
问是否能通过上述操作使得数组的最大公约数大于1。
思路: 考虑到奇数乘偶数就可以变成偶数,偶数的最大公约数至少为2,故可以统计区间内奇数的个数,如果超过k,就不能达成目的,否则能;需要特判长度为1的奇数序列。
时间复杂度:O(T)
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define PII pair<int, int> #define x first #define y second const int maxn = 1e6 + 10; const int INF = 0x3f3f3f3f; const ll M = 11092019; const int N = 100010; int main() { int t;cin>>t; while(t--){ int l,r,k; cin>>l>>r>>k; int num=(r-l+1)-(r/2-(l-1)/2); if(l==r){ if(l>1)cout<<"YES"<<endl; else cout<<"NO"<<endl; } else{ if(k>=num) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/15840910.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
补题*总结题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步