忽然發現五天沒記錄了,這五天學習徹底沒有按着正常規劃進行,先羅列一下吧。ios
A題:理論上能夠用暴力搜,可是除一以外全部的答案均可以寫成"x x",再也不寫代碼解釋。
B題:題意爲數組中的每個數每次都減去一個最小的數,並輸出這個數。能夠先排序,而後下面展現的是O(n)複雜度的算法。算法
#include<iostream> #include<vector> #include<cstdio> #include<algorithm> using namespace std; int a[100005]; int main(){ int n,k; scanf("%d%d",&n,&k); for(int i = 0; i < n; i++){ scanf("%d",&a[i]); } sort(a,a+n); int sumsub = 0; int j = 0; while(k--){ while(j <n && a[j] <= sumsub) j++; if(j == n) printf("0\n"); else { printf("%d\n",a[j]-sumsub); sumsub = a[j]; } } return 0; }
C題:題目提到了兩個操做,要求在n+1個操做以內講數組變爲升序。能夠轉化爲前n個操做講n個數對n+1的餘數變爲遞增,而後最後一步對n+1取模。數組
#include<iostream> #include<cstdio> #include<vector> using namespace std; int a[10000]; vector<pair<int,int>> ans; int main(){ int n ; scanf("%d",&n); for(int i = 1; i <= n; i++){ scanf("%d",&a[i]); } int cnt = 0; int sum = 0; for(int i = n; i >= 1; i--){ if((sum+a[i])%(n+1) == i) continue; else { cnt++; int d = (sum+a[i])%(n+1); if(i > d) {ans.push_back(make_pair(i,i-d));sum+=i-d;} else {ans.push_back(make_pair(i,n+1+i-d));sum+=n+1+i-d;} } } cnt++; printf("%d\n",cnt); for(int i = 0; i < cnt-1;i++){ printf("1 %d %d\n",ans[i].first,ans[i].second); } printf("2 %d %d",n,n+1); return 0; }
D題思路是對的,可是由於一些緣由沒有去作,否則可能此次就上藍了。機器學習
#include<iostream> using namespace std; int query(int a,int b){ cout << "? "<<a<<" "<<b<<endl; int res; cin >> res; return res; } int a = 0,b = 0; int main(){ bool comp = (query(0,0) == 1); for(int i = 29; i >= 0; i--){ int p = query(a,b|1<<i); int q = query(a|1<<i,b); if(p == 1 && q == -1){ a = a|1<<i; b = b|1<<i; }else if( p == -1 && q == 1){ continue; }else{ if(comp) a = a|1<<i; else b = b|1<<i; comp = (p==1); } } cout << "! "<<a<<" "<<b<<endl; return 0; }