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
",maze[n][n]);
16     }
17     return 0;
18 }
View Code

 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 ≤ k1 ≤ 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(" ");

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
");
24             continue;
25         }
26         printf("YES
");
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("
");
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("
");
48             }
49         }
50     }
51     return  0;
52 }
View Code

 

原文地址:https://www.cnblogs.com/-maybe/p/4383564.html