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();
}