T1
题目描述
地上有2N个石头,排成了一条线,相邻的石头距离为1,石头之间有着不同的大小,有N种大小不同 的石头,即相同大小的石头有2个,现将石头按照从小到大的顺序依次编号为1到N,有2个石头共享 相同的编号,现在小武和小林要同时从最左边的石头出发,按照石头大小依次捡起编号为1到N的石 头,并且相同编号的石头同一个人只能捡起来一次,现在他们想把地上的石头都捡完,求两个人的行 走的最短距离和为多少?
模拟!
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
}a[1000010];
bool cmp(node l,node r)
{
if(l.x==r.x) return l.y<r.y;
return l.x<r.x;
}
int main()
{
freopen("stone.in","r",stdin);
freopen("stone.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=2*n;i++)
{
cin>>a[i].x;
a[i].y=i;
}
stable_sort(a+1,a+2*n+1,cmp);
int ans=a[1].y-1+a[2].y-1;
for(int i=3;i<=2*n;i++)
{
ans+=abs(a[i].y-a[i-2].y);
}
cout<<ans<<endl;
return 0;
}
T2
题目描述
小武的实验室里有一种魔法药水,这个药水有个很奇怪的性质,它只能在盛放的体积为2的幂次时保 持稳定,例如1,2,4,8。所以小武在实验室里放置了很多容积为2的幂次的瓶子,其中N瓶放有魔法药 水,第i瓶魔法药水的体积为2的L[i]次方。这天小武想要收拾一下实验室,小武想知道最少用多少个瓶 子能把实验室的药水装完。
假设小武有任意2的幂次容积的瓶子,并且每种瓶子的数量足够使用。
用桶记录当前幂的值 每两个可以组成一个更大的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[10000005],maxi;
ll ans;
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
a[x]++;
maxi=max(maxi,x);
}
for(register int i=0;i<=maxi;i++)
{
if(a[i]>1)
{
a[i+1]+=a[i]/2;
a[i]%=2;
if(i==maxi) maxi++;
}
}
for(register int i=0;i<=maxi;i++)
if(a[i]) ans++;
printf ("%lld",ans);
return 0;
}
T3
题目描述
小武有n个数字,这天小武想将数字理的顺一点,小武要把数字分组,每组的个数都是m,并且这m个 数字连续,小武想知道可以做到吗?
#include <bits/stdc++.h>
using namespace std;
int a[1000010],t,m,n,k;
bool f[12];
int main()
{
freopen("group.in","r",stdin);
freopen("group.out","w",stdout);
memset(f,0,sizeof(f));
int i;
cin>>t;
for(i=0; i<t; i++)
{
cin>>n>>m;
memset(a, 0, sizeof(a));
for (int j=0; j<n; j++)
{
cin>>k;
a[k]++;
}
f[i] = true;
while (n>0 && f[i])
{
for (int j=0; j<1000; j++)
{
if (a[j]>0)
{
for (k=j; k<j+m; k++)
{
if (a[k]<=0)
{
f[i] = false;
break;
}
a[k]--;
n--;
}
break;
}
}
}
}
char ans[][12] = {"false", "true"};
for(i=0;i<t;i++)
{
cout<<ans[f[i]]<<endl;
}
return 0;
}
T4
题目描述
小武有2个方程,x|y=A,x+y=B,其中|为二进制或符号,x和y是未知数,A和B已知,小武想知道这个 方程是否有非负整数解。
解题思路
① B必大于A,因为x和y同一位上都是1的话,A当前位是1,而B则进位了
于是可以得出B - A就是x和y同为1位的和
比如:A = 5(101), B = 6(110), B - A = 1(001), 那么x和y的第0位必为1,其它位没有条件限制
A=2(010), B=5(101), B - A = 3(011),
那么x和y第0位和第1位必为1,但是A的第0位并不是1,所以A,B不成立
② A | (B - A)判断必为1位是不是1,如果求出的依旧是A,那么必为1位是1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
freopen("solution.in","r",stdin);
freopen("solution.out","w",stdout);
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
ll a,b;
cin>>a>>b;
ll ans=a|(b-a);
if(a==ans && b>=a)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}
##https://www.zhihu.com/question/20671626##