堅持的次日,給本身打個kao,加油ios
傳送門ide
A題大數據
題意:給你n個數,一個條件(一組裏面的數任意兩個數的差的絕對值不能爲一),分組儘量少;優化
思路:很顯然若是把全部數對(一個數存在另外一個數和它差值爲一),把這兩個數分開後,分紅兩組就能夠;若是不存在就分爲一組。spa
代碼:code
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 using namespace std; 8 9 typedef long long ll; 10 11 int main() 12 { 13 int q; 14 cin >> q; 15 while(q--) 16 { 17 int n; 18 cin >> n; 19 int a[110]; 20 for(int i=1;i<=n;i++) 21 { 22 cin >> a[i]; 23 } 24 sort(a+1,a+1+n); 25 int flag=0; 26 for(int i=2;i<=n;i++) 27 { 28 if(a[i]-a[i-1]==1) 29 { 30 flag=1; 31 break; 32 } 33 } 34 if(flag){ 35 cout <<2<<endl; 36 } 37 else{ 38 cout << 1<<endl; 39 } 40 } 41 return 0; 42 }
B題blog
題意;一共有n我的,每一個人能夠把本身的書傳給一我的,問傳回本身手中所需的次數(給n個序列表示第i我的能夠傳給ai)遊戲
思路:ci
1.數據量比較小能夠直接暴力寫,每一個人都循環一次;get
2.另外一種傳書遊戲,咱們能夠很容易知道,在一個環裏面的人,所需的次數都是相同的,利用這一點咱們能夠進行優化(咱們能夠每次從一個沒有找過的點開始,找到一個完整的環或者換上有的元素已經再別的環上找到過,咱們就再也不往下找,當前的就是咱們這個環上全部點的次數)
代碼:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 8 using namespace std; 9 typedef long long ll; 10 11 int main() 12 { 13 int q; 14 cin >> q; 15 while(q--) 16 { 17 int n; 18 cin >> n; 19 int a[210],b[210]; 20 for(int i=1;i<=n;i++) 21 { 22 cin >> a[i]; 23 b[i]=0; 24 } 25 for(int i=1;i<=n;i++) 26 { 27 28 if(b[i]!=0)continue; 29 // cout << a[i] <<i<<endl; 30 if(i == a[i]){ 31 b[i]=1; 32 // cout << b[i]<<i<<endl; 33 } 34 else{ 35 int t = a[i]; 36 int num =1; 37 while(t!=i) 38 { 39 t=a[t]; 40 num++; 41 } 42 b[t]=num; 43 b[a[i]]=num; 44 } 45 } 46 for(int i=1;i<n;i++) 47 { 48 printf("%d ",b[i]); 49 } 50 printf("%d\n",b[n]); 51 } 52 return 0; 53 }
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 #include <cmath> 7 8 using namespace std; 9 typedef long long ll; 10 const int N = 2e5 +10; 11 int a[N],b[N]; 12 int main() 13 { 14 int q; 15 cin >> q; 16 while(q--) 17 { 18 int n; 19 cin >> n; 20 for(int i=1;i<=n;i++) 21 { 22 scanf("%d",&a[i]); 23 b[i]=0; 24 } 25 for(int i=1;i<=n;i++) 26 { 27 if(b[i]!=0)continue; 28 int t = a[i]; 29 if(t==i){ 30 b[i]=1; 31 continue; 32 } 33 int num =1; 34 int q[N]; 35 q[0]=t; 36 q[1]=i; 37 int cun =2; 38 while(b[t]==0&&t!=i) 39 { 40 t = a[t]; 41 num++; 42 q[cun]=t; 43 cun++; 44 } 45 // cout << num << endl; 46 if(num>=n) 47 { 48 for(int i=0;i<cun;i++)b[q[i]]=n;break; 49 } 50 if(t==i) 51 { 52 for(int i=0;i<cun;i++)b[q[i]]=num; 53 } 54 else{ 55 for(int i=0;i<cun;i++)b[q[i]]=b[t]; 56 } 57 } 58 for(int i=1;i<n;i++){ 59 printf("%d ",b[i]); 60 } 61 printf("%d\n",b[n]); 62 } 63 }
C題
題意:給出一個數,讓你輸出大於等於這個數的一個特殊性質的數(就是由3的i次方的和,其中 i 不能重複 ,不能夠同時含有2個及以上 3 的k次方)
思路;
1.暴力寫法,因爲數據較小咱們能夠直接暴力枚舉出全部(1e5之內的)這種特殊的數
2.看了大佬的代碼才瞭解居然能夠如此簡單,咱們先從一開始把三的全部次方都加起來(直到大於等於n),而後將(保證在大於等於n的前提下,減掉能夠減掉的全部3的次方)
就是一個簡單的容斥思想(啊啊啊,我居然沒想到)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <vector> 8 #include <map> 9 using namespace std; 10 typedef long long ll; 11 map<ll,ll>mp; 12 ll a[10101000]; 13 int main() 14 { 15 int n; 16 cin >> n; 17 a[0]=1; 18 a[1]=3; 19 a[2]=4; 20 a[3]=9; 21 a[4]=10; 22 a[5]=12; 23 a[6]=13; 24 for(int i=0;i<7;i++)mp[a[i]]=1; 25 ll q=9; 26 int cun =6; 27 for(int i=3;i<18;i++) 28 { 29 q=q*3; 30 cout <<q <<endl; 31 int d=cun; 32 cun++; 33 a[cun]=q; 34 for(int j=0;j<=d;j++) 35 { 36 ll b = (ll)q+a[j]; 37 if(mp[b]==1)continue; 38 cun++; 39 a[cun]=b; 40 } 41 } 42 sort(a,a+cun+1); 43 while(n--) 44 { 45 int p; 46 cin >> p; 47 int j = lower_bound(a,a+cun+1,p)-a; 48 cout << a[j]<<endl; 49 } 50 return 0; 51 }
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <cmath> 6 #include <algorithm> 7 #include <map> 8 9 using namespace std; 10 typedef long long ll; 11 12 int main() 13 { 14 int n; 15 cin >> n; 16 while(n--) 17 { 18 ll p; 19 cin >> p; 20 ll res =1,q=3; 21 while(res<p) 22 { 23 res+=q; 24 q*=3; 25 } 26 while(q) 27 { 28 if(res-q>=p)res-=q; 29 q/=3; 30 } 31 cout << res <<endl; 32 } 33 return 0; 34 }
啊啊啊,我又是隻能作簡單的前三個題,我太難了,啊啊啊啊,明天再見!