Codeforces Round #289 (Div. 2, ACM ICPC Rules)
A题:
有一个n*n的矩阵,矩阵的第一行和第一列的值都为1,其余的有:
a[i][j]=a[i-1][j]+a[i][j-1];
现在给出一个n求出这个n*n的矩阵中最大的数。
显然,最大的数就是a[n][n]。
因为n<=10,所以先预处理出一个10*10的矩阵,然后每输入一个n,直接输出a[n][n].
1 #include<cstdio> 2 int maze[11][11]; 3 int main() 4 { 5 for(int i=1;i<=10;i++) 6 maze[i][1]=1; 7 for(int i=1;i<=10;i++) 8 maze[1][i]=1; 9 for(int i=2;i<=10;i++){ 10 for(int j=2;j<=10;j++) 11 maze[i][j]=maze[i-1][j]+maze[i][j-1]; 12 } 13 int n; 14 while(scanf("%d",&n)!=EOF){ 15 printf("%d\n",maze[n][n]); 16 } 17 return 0; 18 }
B题:
有n堆石头,第i堆石头有a[i]个,现在有k种不同颜色的染料,现在要对这n堆石头的每一个进行染色。
要求:每个石头都要染色,但不是所有颜色都必须用到。 let's say that bi, c is the number of pebbles of color c in the i-th pile. Then for any 1 ≤ c ≤ k, 1 ≤ i, j ≤ n the following condition must be satisfied |bi, c - bj, c| ≤ 1. It isn't necessary to use all k colors: if color c hasn't been used in pile i, then bi, c is considered to be zero.
想法:
1.找出最小的一堆和最大的一堆。对于最小的一堆,根据贪心,最小的一堆里,每个石头应该尽量染成不同的颜色。
若k>=min:则min有min种颜色,则最大的一堆可以到达min+min*1+(k-min)*1=min+k
若0.5*min<k<min:则最大可到达k+k*1+min-k=min+k
若k<0.5*min,k<0.25*min:都可证最大的一堆:min+k
结论:最大的一堆<=min+k
2.对于每一堆,尽量不断重复用1到k进行染色,直到a[i] 染完。
可以用一个数b记录输出的数量,每输出一个数,b++;
if( b==a[i])
printf("\n");
else
printf(" ");//表示输出空格
在嵌套循环里面,大循环和小循环不要用同一个变量做下标,我刚才都是用i,i。哭晕在厕所。
1 #include<cstdio> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=105; 5 int a[maxn]; 6 int main() 7 { 8 int n;//the number of array 9 int k;//the number of color 10 while(scanf("%d%d",&n,&k)!=EOF){ 11 for(int i=1;i<=n;i++){ 12 scanf("%d",&a[i]); 13 } 14 int max=-inf; 15 int min=inf; 16 for(int i=1;i<=n;i++){ 17 if(a[i]>max) 18 max=a[i]; 19 if(a[i]<min) 20 min=a[i]; 21 } 22 if(max-min>k){ 23 printf("NO\n"); 24 continue; 25 } 26 printf("YES\n"); 27 for(int i=1;i<=n;i++){ 28 int b=0; 29 int num=a[i]/k; 30 for(int j=1;j<=num;j++){ 31 for(int l=1;l<=k;l++){ 32 printf("%d",l); 33 b++; 34 if(b<a[i]) 35 printf(" "); 36 else 37 printf("\n"); 38 } 39 } 40 int rest=a[i]-num*k; 41 for(int j=1;j<=rest;j++){ 42 printf("%d",j); 43 b++; 44 if(b<a[i]) 45 printf(" "); 46 else 47 printf("\n"); 48 } 49 } 50 } 51 return 0; 52 }