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;
}