D. Array and Operations

题目描述

题意

        题目大概的意思是给你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");
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Krito.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值