题目描述
题意
题目大概的意思是给你n个数,然后进行k次操作后,将在操作中未使用的数全都加到得分中,使得分最小。
这k次操作是选择两个数,x,y,然后将x/y向下取整(3.8取作3)后的结果加入到你的得分中。
昨天div3的一道题,写了40多分钟的c题结果wa了(自己还是太菜了), 果断放弃,转战d题,结果20分钟就写出来了。
题解
我们有k次机会将两个数变为他们的商,加入到得分中,因为x/y向下取整,可以想到1/10和9/10的结果都是0.所以我们的y优先选择最大的一批数,x选择次大的一批数,这样可以把较大的数消耗掉使得最后未进行操作的数直接加到得分中时最小。现在的关键是如何分批,因为有k次操作,所以有k个y,k个x,我们将数组从小到大排序后分为3个部分,最后k个数作为y,然后在第一个y前面取k个数作为与之对应的x,剩下的数直接加到得分中即可。
AC代码
/*@_krito*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int t;
cin>>t;
while(t--){
int n,k,a[101];
bool vis[101]={0};//不必要,懒得改了.
ll ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=n;i>=n-k+1;i--){
int j=i-k;
vis[i]=true;
vis[j]=true;
ans+=a[j]/a[i];
}
for(int i=1;i<=n;i++){
if(!vis[i]) ans+=a[i];
}
cout<<ans<<endl;
}
}
这里一并附上a,b两题的ac代码。
B. Missing Bigram
题目描述
题意
abbaaba,对每个元素取该元素与后一个元素输出,对第一个a,输出ab,对第二个字符b,输出bb.....然后结果就是ab,bb,ba,aa,ab,ba。现在题目给出这n个字符对中的n-1个字符对,让你输出原字符串。如ab,bb,ba,aa,ba。你要求出abbaaba(答案不唯一,满足条件即可)
题解
模拟题意即可
/*@_krito*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct word{
char l;
char r;
};
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
word w[102];
for(int i=1;i<=n-2;i++){
cin>>w[i].l;
cin>>w[i].r;
}
bool falg=true;
for(int i=1;i<=n-2;i++){
if(i==n-2) {
cout<<w[i].l<<w[i].r;
continue;
}
if(w[i].r==w[i+1].l)
cout<<w[i].l;
else {
cout<<w[i].l<<w[i].r;
falg=false;
}
}
if(falg) cout<<w[n-2].r;
cout<<endl;
}
}
A. Polycarp and Sums of Subsequences
题目描述
题意
给你一个数组,这个数组的所有数都是由三个数本身即他们随意组合相加的结果。
输出这三个数。
题解
先排序,然后最小的两个数肯定是这三个数中的两个。还剩一个数,因为最大的数是三个数相加,用最大的数减去最小的两个数就是第三个数,然后输出即可。
AC代码
/*@_krito*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 8
int main(){
int t,a[N];
cin>>t;
while(t--){
for(int i=1;i<N;i++){
scanf("%d",&a[i]);
}
a[3]=a[7]-a[1]-a[2];
for(int i=1;i<=3;i++){
printf("%d ",a[i]);
}
printf("\n");
}
}