1. 程式人生 > 實用技巧 >P1154 奶牛分廄

P1154 奶牛分廄

題目連結

題面:

換句話說:

  給定n和長度為n的陣列a , 你要求出最小的k使得,沒有兩個a[i] 、a[j] 會滿足:a[i] % k = a[j] % k

思路:

  

  所以,求出陣列a的兩兩差值x,x的所有因子都不滿足條件

  然後遍歷找第一個滿足條件的k

程式碼:

  一開始是列舉差值,找他的所有因子進行標記,但是開了o2還是又一個點T,這是90分的程式碼:

  

#include<bits/stdc++.h>
using namespace std;
const int maxn =  1e6 + 10;
#define ll long long
#define
ios std::ios::sync_with_stdio(false) const ll INF(0x3f3f3f3f3f3f3f3fll); const int inf(0x3f3f3f3f); int a[maxn]; int cha[maxn]; int ans[maxn]; vector<int>vec[maxn]; int vis[maxn]; signed main() { ios; cin.tie(0); int n; cin >> n; for(int i = 1 ; i <= n ; i ++) cin >> a[i];
for(int i = 1 ; i <= n ; i ++){ for(int j = i + 1 ; j <= n ; j ++){ int now = abs(a[j] - a[i]); if(vis[now])continue; vis[now] ++; ans[now] ++; for(int k = 2 ; k * k <= now ; k ++){ if(now % k == 0){ ans[k]
++; if(now / k != k) ans[now / k] ++; } } } } for(int i = n ; i <= 1e6 ; i ++){ if(!ans[i]){ cout << i <<'\n'; break; } } return 0; }
View Code

  後來看了題解別人的寫法發現 , 先標記下差值,然後從n開始列舉k , 判斷k的倍數是否被標記過 , 如果沒有,就是答案,這樣就過了QAQ , 這是AC的:

#include<bits/stdc++.h>
using namespace std;
const int maxn =  1e6 + 10;
#define ll long long
#define ios std::ios::sync_with_stdio(false)
const ll INF(0x3f3f3f3f3f3f3f3fll);
const int inf(0x3f3f3f3f);

int a[maxn];
int cha[maxn];
int ans[maxn];
vector<int>vec[maxn];
int vis[maxn];
signed main()
{
    ios;
    cin.tie(0);
    int n , maxx = 0;
    cin >> n;
    for(int i = 1 ; i <= n ; i ++) cin >> a[i] , maxx = max(maxx , a[i]);
    for(int i = 1 ; i <= n ; i ++){
        for(int j = i + 1 ; j <= n ; j ++){
            int now = abs(a[j] - a[i]);
            if(vis[now])continue;
            vis[now] ++;
            ans[now] ++;
        }
    }
    for(int i = n ; i <= maxx ; i ++){
        bool ok = true;
        for(int j = i ; j <= maxx ; j += i){
            if(ans[j]){
                ok = false;
                break;
            }
       }
       if(ok){
            cout << i << '\n';
            break;
       }
    }
    return 0;
}
View Code