P1154 奶牛分廄
阿新 • • 發佈:2020-09-01
題目連結
題面:
換句話說:
給定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 #defineView Codeios 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; }
後來看了題解別人的寫法發現 , 先標記下差值,然後從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