A
# include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int T;
cin>>T;
while(T--)
{
int a,b;
cin>>a>>b;
int x=0x3f3f3f3f;
cout<<b-a<<endl;
}
return 0;
}
B
遍历倒序输出即可
# include <bits/stdc++.h>
using namespace std;
# define int long long
const int N=510;
char a[N][5];
signed main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
{
cin>>a[i][j];
}
}
for(int i=n;i>=1;i--)
{
for(int j=4;j>=1;j--)
{
if(a[i][j]=='#')
cout<<j<<" ";
}
}
cout<<endl;
}
return 0;
}
C
如果x所需的步数大,在x走完之前,y肯定已经达到,x走完最后一步,y就不用走了,所以是2x-1;
如果是y较大或者相等,则必须走完x再走y,所有结果为2y
# include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int T;
cin>>T;
while(T--)
{
int x,y,k;
cin>>x>>y>>k;
int xx = x/k+(x%k!=0);
int yy = y/k+(y%k!=0);
if(xx>yy)
{
cout<<(xx*2)-1<<endl;
}
else
{
cout<<(yy*2)<<endl;
}
}
return 0;
}
E
考虑二分 我们要找取绝对值后最小的值,其实就是找最接近0的值,不难想到就是最后一个负值和第一个正值,我们分别取绝对值再取两者较小值即可。因为它是单调函数所以可以二分来找答案。
在不断缩小答案范围的过程中,如果后面的项和大于前面的项之和,我们的目的是让两个的值尽可能接近,所以要把后面的项和减小,同时前面的项和增大,就是把mid=l,而前面项大于后面项者同理,最后比较l和r的答案的大小即输出
# include <bits/stdc++.h>
using namespace std;
#define int long long
int n,k,sum;
bool check(int mid)
{
int sum1=(k+mid)*(mid-k+1)>>1;
if(sum1<=sum-sum1)
return true;
return false;
}
signed main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>k;
int l=k,r=k+n-1;
sum=n*(k+k+n-1)>>1;
//cout<<sum<<endl;
while(l<r)
{
int mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
//cout<<l;
int a=(k+l)*(l-k+1)/2,b=sum-a;
int x=abs(b-a);
x=min(x,abs(sum-(k+l+1)*(l-k+2)));
cout<<x;
cout<<endl;
}
return 0;
}