A - Two Rival Students
题意:共n个人排一排,两个人,位于a,b,相邻位置交换至多x次,最大化abs(a-b)的值。
题解:每次交换至多+1,不能超过n-1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
int t;
scanf("%d", &t);
while(t--) {
int n, x, a, b;
scanf("%d%d%d%d", &n, &x, &a, &b);
printf("%d\n", min(n - 1, abs(a - b) + x));
}
return 0;
}
B - Magic Stick
题意:给一个数a,有无限次的两种操作:1、若a是偶数,则加上a的一半。2、若a>1,则减去1。问是否可以从x构造出y。
题解:有无限次减法,就看1操作能到达哪里就可以。首先1是不能动的,y<=1。其次,2可以到3,3可以到2,没办法突破到4,所以x=2或x=3时,y<=3。而4可以有4->6->9->8->12->18->27->26->39->...这样无限做下去,所以4以上必有解。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
int t;
scanf("%d", &t);
while(t--) {
ll x, y;
scanf("%lld%lld", &x, &y);
bool suc = 0;
if(x == 1)
suc = (y <= 1);
else if(x <= 3)
suc = (y <= 3);
else
suc = 1;
puts(suc ? "YES" : "NO");
}
return 0;
}