kafka基礎:解決org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for xxx topic
A. Rainbow Dash, Fluttershy and Chess Coloring
題意:給你一個 n*n的矩陣,讓你在其中塗上藍紅兩種顏色,每一次可以塗色的格子為旁邊沒有與當前要塗的顏色的相反顏色的格子,即不可能出現相同顏色的相鄰格子。
思路:每次貪心,塗儘量多的格子,在找規律。即如圖所示,答案就是 n/2+1。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 998244353 4 #define INF 0x3f3f3f3f 5View Code#define mem(a,x) memset(a,x,sizeof(a)) 6 #define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 using namespace std; 10 11 int main() 12 { 13 int t; 14 scanf("%d",&t);15 while(t--){ 16 int n; 17 cin>>n; 18 cout<<n/2+1<<endl; 19 } 20 return 0; 21 }
B. Applejack and Storages
題意:給你 n 條邊,再給你 q 次操作,問你在每次操作後,這些邊是否能組成一個正方形和一個矩形。
思路:用 num[ ]陣列維護擁有各長度邊的總數,用四個變數維護總數大於等於8、大於等於6、大於等於4、大於等於2的各長度邊的數量,最後通過對這些變數的判斷來確定。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 998244353 4 #define INF 0x3f3f3f3f 5 #define mem(a,x) memset(a,x,sizeof(a)) 6 #define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 using namespace std; 10 11 int a[100005]; 12 bool cmp(int x,int y) 13 { 14 return x>y; 15 } 16 int main() 17 { 18 int n,q; 19 int a6=0,b4=0,c2=0,a8=0; 20 mem(a,0); 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++){ 23 int x; 24 scanf("%d",&x); 25 a[x]++; 26 } 27 for(int i=1;i<=100000;i++){ 28 if(a[i]>=8){ 29 a8++; 30 } 31 if(a[i]>=6&&a[i]<8){ 32 a6++; 33 } 34 if(a[i]>=4&&a[i]<6){ 35 b4++; 36 } 37 if(a[i]>=2&&a[i]<4){ 38 c2++; 39 } 40 } 41 scanf("%d",&q); 42 43 while(q--){ 44 getchar(); 45 char c; 46 int x; 47 scanf("%c %d",&c,&x); 48 if(c=='+'){ 49 a[x]++; 50 if(a[x]==2){ 51 c2++; 52 } 53 if(a[x]==4){ 54 c2--; 55 b4++; 56 } 57 if(a[x]==6){ 58 a6++; 59 b4--; 60 } 61 if(a[x]==8){ 62 a8++; 63 a6--; 64 } 65 }else if(c=='-'){ 66 a[x]--; 67 if(a[x]==1){ 68 c2--; 69 } 70 if(a[x]==3){ 71 b4--; 72 c2++; 73 } 74 if(a[x]==5){ 75 a6--; 76 b4++; 77 } 78 if(a[x]==7){ 79 a8--; 80 a6++; 81 } 82 } 83 if(a8>=1){ 84 cout<<"YES"<<endl; 85 }else{ 86 if(a6>=1){ 87 if(b4>=1||c2>=1||a6>=2){ 88 cout<<"YES"<<endl; 89 }else{ 90 cout<<"NO"<<endl; 91 } 92 }else{ 93 if(b4>=1){ 94 if((b4>=2)||(c2>=2)){ 95 cout<<"YES"<<endl; 96 }else{ 97 cout<<"NO"<<endl; 98 } 99 }else{ 100 cout<<"NO"<<endl; 101 } 102 } 103 } 104 } 105 return 0; 106 }View Code
C. Pinkie Pie Eats Patty-cakes
題意:給你 n 個食物,每個數字代表食物編號,問你怎樣排序可以使所有吃到相同食物的間隔的最小值最大。
思路:找到數量最多的食物和最大數量的食物的總數,將這些取出來,按如圖的順序進行排序組成隔板。
在隔板間新增其他數字即可使最小值最大。
程式碼:
#include<bits/stdc++.h> #define ll long long #define MOD 998244353 #define INF 0x3f3f3f3f #define mem(a,x) memset(a,x,sizeof(a)) #define _for(i,a,b) for(int i=a; i< b; i++) #define _rep(i,a,b) for(int i=a; i<=b; i++) #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; int a[100005]; int num[100005]; int main() { int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); mem(num,0); int maxn=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); num[a[i]]++; maxn=max(num[a[i]],maxn); } int x=0; for(int i=1;i<=n;i++){ if(num[i]==maxn){ x++; } } int p=n-maxn*x; cout<<x+p/(maxn-1)-1<<endl; } return 0; }View Code
D. Rarity and New Dress
題意:給你n*m的矩形,每個放個有一個字母,問你在矩形中一共有多少個 斜正方形(如圖所示的圖形)。
思路:dp題,dp[ i ][ j ] 表示 以第 i 行 第 j 列的方塊為底部的 斜正方形的數量。也就是尋找這個點向上延申的斜正方形的數量。那麼我們就要去確定這個點向上延申的方塊數量是由哪幾個點維護的。
先看圖一,我們首先要判斷點 (i-1,j) (i-1,j-1) (i-1,j+1) (i-2.j)這四個點是否和底部點一致,如果不一致,那麼這個底部點就只能構成 1 個斜正方形。否則,我們就要看[i-1][j-1]、[i-1][j+1]、[i-2][j]這三個點所可以構成的斜正方形的數量,看一下圖二(只看綠色部分),以點[i-1][j-1]為底部可以構成 2 個斜正方形(包括自身),同理以另外兩個點也是隻有兩個斜正方形,那麼由[ i ][ j ]點維護的dp[ i ][ j ]=2+1=3,因為有三個點同時維護,因此需要這三個的最小值,因此dp轉移方程為 dp[ i ][ j ] = min(dp[ i-1 ][ j-1 ],dp[ i-1 ][ j+1 ],dp[ i-2][ j ])+1 。
程式碼:
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define MOD 998244353 4 #define INF 0x3f3f3f3f 5 #define mem(a,x) memset(a,x,sizeof(a)) 6 #define _for(i,a,b) for(int i=a; i< b; i++) 7 #define _rep(i,a,b) for(int i=a; i<=b; i++) 8 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 9 using namespace std; 10 11 char mp[2005][2005]; 12 int dp[2005][2005]; 13 int main() 14 { 15 int n,m; 16 ll sum=0; 17 scanf("%d %d",&n,&m); 18 for(int i=1;i<=n;i++){ 19 getchar(); 20 for(int j=1;j<=m;j++){ 21 scanf("%c",&mp[i][j]); 22 } 23 } 24 for(int i=1;i<=n;i++){ 25 for(int j=1;j<=m;j++){ 26 dp[i][j]=1; 27 if(i>=3&&j>=2&&mp[i][j]==mp[i-2][j]&&mp[i][j]==mp[i-1][j-1]&&mp[i][j]==mp[i-1][j+1]&&mp[i][j]==mp[i-1][j]){ 28 dp[i][j]=min(dp[i-2][j],min(dp[i-1][j-1],dp[i-1][j+1]))+1; 29 } 30 sum+=(ll)dp[i][j]; 31 } 32 } 33 cout<<sum<<endl; 34 return 0; 35 }View Code