Codeforces 1278 B. A and B (思維題)

題目鏈接:https://codeforces.com/contest/1278/problem/B

題目大意:

給定兩個整數a,b,現在進行以下的操作:

第一次操作,從a,b兩個數中選擇一個+1。

第二次操作,從a,b兩個數中選擇一個+2。

第三次操作,從a,b兩個數中選擇一個+3。

....

問你最少需要多少步驟的操作,使得a,b兩個整數相等?

思路:

要讓兩個數相等,我們肯定儘可能地彌補兩個數的差值,設比較小的數爲a,比較大的數位b,兩者差值爲del

我們先將所有操作給到a身上,直到a>=b,此時有

1+2+3+\cdot \cdot \cdot +k=del+newdel

newdel爲新的差值。

  • 如果newdel爲偶數,我們考慮之前加在a上的值:1+2+3+...+k。如果現在我們不把一個數x加在a上,而是加在b上,那麼對於上面的等式,是不是就相當於將newdel減去2*x呢?也就是說,我可以通過改變之前的k個操作的位置,構造出任何小於k*(k+1)的偶數的差!所以,此時答案就是k。
  • 如果newdel爲奇數,我們通過上面的方法只能構造出偶數,所以不能再向上面那樣操作了。我們再在a上加上k+1,此時newdel=newdel+k+1,我們又可以接着利用上面的結論判斷:
    • 如果k+1爲奇數,那麼newdel+k+1爲偶數,可以湊出來,答案就是k+1
    • 如果k+1爲偶數,那麼newdel+k+1爲奇數,此時仍然不能湊出來,但是k+2一定是奇數,newdel+k+2一定可以構造出來,所以答案就是k+2
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=100000+10;
int sum[maxn];
void init(){
    sum[0]=0;
    for(int i=1;i<maxn;i++){
        sum[i]=sum[i-1]+i;
    }
}
signed main(){
    int T;
    init();
    scanf("%lld",&T);
    while(T--){
        int a,b;
        scanf("%lld%lld",&a,&b);
        int del=abs(a-b);
        if(del==0){
            puts("0");
            continue;
        }
        int ans=0;
        int inx=0;
        for(int i=1;i<maxn;i++){
            if(sum[i]>=del){
                ans=sum[i];
                inx=i;
                break;
            }
        }
        if(ans==del){
            printf("%lld\n",inx);
        }
        else{
            int now=ans-del;
            if(now%2==0){
                printf("%lld\n",inx);
            }
            else{
                if((inx+1)%2==0){
                    printf("%lld\n",inx+2);
                }
                else{
                    printf("%lld\n",inx+1);
                }
            }
        }
    }
    return 0;

}
/*
100
1 1000000000
999999999 1
1 999999998
999999997 1
1 999999996
999999995 1
1 999999994
999999993 1
1 999999992
999999991 1
1 999999990
999999989 1
1 999999988
999999987 1
1 999999986
999999985 1
1 999999984
999999983 1
*/

 

發佈了216 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章