A. Polycarp and Sums of Subsequences
题目描述
思路:只有7个数,暴力就完事了
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int maxn=1e6+5;
void solve(){
int n = 7;
int a[100]={
0};
for (int i = 0; i < n;i++){
cin >> a[i];
}
for (int i = 0; i < 6;i++){
for (int j = 0; j < 6;j++){
for (int k = 0; k < 6;k++){
if(i!=j&&j!=k&&i!=k&&(a[i]+a[j]+a[k]==a[6])){
cout << a[i] <<" "<< a[j] <<" " << a[k]<<endl;
return;
}
}
}
}
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t ;
while(t--){
solve();
}
return 0;
}
B. Missing Bigram
题目描述
思路:模拟题意,字母相同就删一个,长度不够用“a”补到n。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int maxn=1e6+5;
void solve(){
int n;
cin >> n;
string a, b;
cin >> a;
string cnt=a;
for (int i = 1; i < n - 2;i++){
cin>>b;
if(a[1]==b[0])
cnt += b.substr(1);
else
cnt += b;
a = b;
}
while(cnt.size()<n)
cnt += "a";
cout << cnt << endl;
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t ;
while(t--){
solve();
}
return 0;
}
C. Paint the Array
题目描述
思路:求奇数位和偶数位所有数的最大公因数gcd(),用奇数gcd()检测偶数位的所有数,用偶数gcd()检测所有奇数位的数,如果不能被整除,则该gcd()为一个答案,否则为“0”。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int maxn=1e6+5;
ll gcd(ll a, ll b){
return a % b == 0 ? b : gcd(b, a % b);
}
int n;
bool check(int c,ll b,ll a[]){
for (int i = c; i < n;i+=2){
if(a[i]%b==0){
return 0;
}
}
return 1;
}
void solve()
{
cin>>n;
ll a1, b;
ll a[105] = {
0};
for (int i = 0; i < n;i++){
cin >> a[i];
}
if (n >= 4){
a1 = gcd(a[0], a[2]);
b = gcd(a[1], a[3]);
}else if(n==3){
a1 = gcd(a[0], a[2]);
b = a[1];
}else{
a1 = a[0];
b = a[1];
}
for (int i = 4;i<n;i+=2){
a1 = gcd(a1, a[i]);
if(i+1<n)
b = gcd(b, a[i + 1]);
}
if(check(0,b,a)){
cout << b << endl;
}else if(check(1,a1,a)){
cout << a1 << endl;
}else
cout << 0 << endl;
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t ;
while(t--){
solve();
}
return 0;
}
D. Array and Operations
题目描述
思路:一点点的 思维,数组排序后,对后2*k个树进行操作,由题意可知,题目中求最小的和,而分解到每一步高斯的结果要么为1,要么为0,所以用贪心的思想,使其尽可能为0。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int maxn=1e6+5;
int a[maxn],b[maxn];
void solve(){
int n, k;
cin >> n >> k;
for (int i = 0;i<n;i++){
cin >> a[i];
}
sort(a, a + n);
ll sum = 0;
for (int i = 0; i < n-(2*k);i++)
sum += a[i];
int m = 0;
for (int i = n - (2 * k); i < n;i++){
b[m++] = a[i];
}
for (int i = 0; i < k;i++){
sum += b[i] / b[i+k];
}
cout << sum << endl;
}
int main(){
ios::sync_with_stdio(0);
int t;
cin >> t ;
while(t--){
solve();
}
return 0;
}