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