Codeforces Round 931 (Div. 2)题解(A—C)

本文介绍了三个编程问题:A.通过排序计算差值;B.利用贪心和预处理解决CoinProblem,针对n>30和n<30的不同策略;C.使用贪心方法在FindaMine中寻找特定位置。每个问题展示了不同的算法技巧和策略。
摘要由CSDN通过智能技术生成

A. Too Min Too Max

为了尽量让差变大,取最大两个数a1,a2和最小两个数b1,b2,差为(a1+a2-b1-b1)*2

#include <bits/stdc++.h>
using namespace std;
int n,a[120];
void solve()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+1+n);
	cout<<2*(a[n]+a[n-1])-2*(a[1]+a[2])<<endl;
}
signed main()
{
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	solve();
}

B. Yet Another Coin Problem

显而易见,当n>30时,尽可能多的取用15的硬币即为最佳策略;但当n<30时,就有不同的组合方案。对的情况进行预处理,对价值为1,3,6,10,15的物品进行多重背包。

对于n,若,直接输出预处理的结果;若,输出结果为dp[n%15+15]+n/15-1

#include <bits/stdc++.h>
using namespace std;
int n,re,a[100];
void solve()
{
	cin>>n;
	if(n>30) re=a[n%15+15]+n/15-1;
	else re=a[n];
	cout<<re<<endl;
}
signed main()
{
	for(int i=1;i<=30;i++)
	{
		int b[]={1,3,6,10,15};
		a[i]=a[i-1]+1;
		for(int j=0;j<5;j++)
		{
			if(i>=b[j]) a[i]=min(a[i],a[i-b[j]]+1);
		}
	}
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	solve();
}

C. Find a Mine

贪心的思想,其中一数取最大值,那么他的二进制表示1就最多。接着找进行或运算结果最大的数,这些数存入数组,取最小数。

#include <bits/stdc++.h>
using namespace std;
int n,m;
int dx[]={1,-1,1,-1};
int dy[]={1,-1,-1,1};
int query(int x,int y)
{
	printf("? %d %d\n",x,y);
	fflush(stdout);
	int re;
	cin>>re;
	fflush(stdout);
	return re;
}
void ans(int x,int y)
{
	printf("! %d %d\n",x,y);
	fflush(stdout);
}
bool check(int x,int y)
{
	return (x>=1&&x<=n&&y>=1&&y<=m);
}
void solve()
{
	cin>>n>>m;
	int l1=query(1,1);
	int l2=query(n,1);
	int ay=(l1+l2-n+3)/2;
	int ax=(l1-l2+n+1)/2;
	if(ax>=1&&ax<=n&&ay>=1&&ay<=m&&query(ax,ay)==0)
	{
		ans(ax,ay);
		return;
	}
	int l3=query(1,m);
	ax=(l1+l3-m+3)/2;
	ay=(l1-l3+m+1)/2;
	ans(ax,ay);
}
signed main()
{
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	solve();
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值