目录
A. Difference Operations
题目链接:
题面:?编辑
题意:?
思路:
代码:
B. Difference of GCDs
题目链接:
题面:
题意:
思路:
代码:
C. Doremy's IQ
题目链接:
题面:
题意:?
思路:
代码:
A. Difference Operations
题目链接:
Problem - A - Codeforces
题面:
?
题意:?
给定n个数,可以选择一个位置(2到n)使ai变成ai-a(i-1),问能否把2到n的位置上的数都变成0
思路:
如果后面的每个数都是第一个的倍数,那么就可以变为0
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[105];
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> arr[i];
}
bool f = 0;
for(int i = 1; i < n; i++){
if(arr[i] % arr[0] != 0){
f = 1;
break;
}
}
if(f){
cout << "NO" << endl;
}else{
cout << "YES" << endl;
}
}
return 0;
}
B. Difference of GCDs
题目链接:
Problem - B - Codeforces
题面:
题意:
输入n,l,r,表示从a1至an的值>=l同时<=r,要求i和ai的最大公约数不相同,如果可以构建数组
思路:
i的范围是1到n,那么最大公约数的范围也是1到n,那么我们就可以让gcd(i,ai)= i即可。
我们可以通过l对i的余数来快速查找大于等于l的i的倍数
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[100005];
int main(){
int t;
cin >> t;
while(t--){
int n, l, r;
cin >> n >> l >> r;
bool f = 0;
for(int i = 1; i <= n; i++){
int ans = l % i;
if(ans == 0){
arr[i] = l;
continue;
}
if(l + i - ans <= r){
arr[i] = l + i - ans;
}else{
f = 1;
break;
}
}
if(f){
cout << "NO" << endl;
}else{
cout << "YES" << endl;
for(int i = 1; i <= n; i++){
if(i != 1){
cout << " ";
}
cout << arr[i];
}
cout << endl;
}
}
return 0;
}
C. Doremy's IQ
题目链接:
Problem - C - Codeforces
题面:
?
题意:?
一个人的IQ为q,有n场比赛,第i天只能参加第i场比赛,如果比赛难度大于IQ,那么IQ就会下降,如果IQ为0就不能参加比赛了,问最多能参加多少场比赛?输入一个01串,0表示不参加,1表示参加
思路:
贪心的讲:如果最后一场比赛结束的时候IQ刚好为0,那么我们参加的比赛数是最多的。
所以我们可以倒着往前推来求解
若当前的q小于ai,那么我们就让当前的q++,那么这样子是我们后面的比赛都能参加的最优解
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[100005];
int vis[100005];
int main(){
int t;
cin >> t;
while(t--){
int n, q;
cin >> n >> q;
int ans = 0;
map<int, map<int, int> > mp;
for(int i = 0; i < n; i++){
cin >> arr[i];
vis[i] = 0;
}
int k = 0;
for(int i = n - 1; i >= 0; i--){
if(k >= arr[i]){
vis[i] = 1;
}else{
if(k < q){
vis[i] = 1;
k++;
}
}
}
for(int i = 0; i < n; i++){
cout << vis[i];
}
cout << endl;
}
return 0;
}
|