标签:
A. Maximum in Table
题意:给定一个表格,它的第一行全为1,第一列全为1,另外的数满足a[i][j]=a[i-1][j]+a[i][j-1],求这个表格中的最大的数
a[n][n]即为最大的数
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[12][12],n; int main() { int i,j,max; scanf("%d",&n); memset(a,0,sizeof(a)); for(j=1;j<=n;j++) a[1][j]=1; for(i=1;i<=n;i++) a[i][1]=1; for(i=2;i<=n;i++) for(j=2;j<=n;j++) { a[i][j]=a[i-1][j]+a[i][j-1]; } printf("%d\n",a[n][n]); }
B. Painting Pebbles
题意:给定n堆卵石,以及k种颜色,现在给它们上色,要求任意两堆石头的颜色为c的石头个数相差小于等于1
首先将这n堆石头排序,如果k<max-min,那么肯定不能满足 如果k>max-min,那么一定是每一堆石头重复的颜色越少,越能够满足这个条件,所以对每一堆石头,就从第一种颜色开始涂色,依次涂上1 2 3 ---如果石头的个数超过了颜色的种类,则当前涂到第j个石头,用j对k取余,即为该石头的颜色。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int b[305][305]; struct node { int num; int order; } a[305]; bool cmp(node n1,node n2) { return n1.num<n2.num; } bool cmp0(node n1,node n2) { return n1.order<n2.order; } int main() { int n,k,i,j,ans; scanf("%d %d",&n,&k); memset(b,0,sizeof(b)); for(i=1;i<=n;i++) { scanf("%d",&a[i].num); a[i].order=i; } sort(a+1,a+1+n,cmp); if(k<a[n].num-a[1].num) printf("NO\n"); else { for(i=1;i<=n;i++) { for(j=1;j<=a[i].num;j++) { b[a[i].order][j]=j%k; if(j%k==0) b[a[i].order][j]=k; } } printf("YES\n"); sort(a+1,a+n+1,cmp0); for(i=1;i<=n;i++) { for(j=1;j<=a[i].num;j++) printf("%d ",b[a[i].order][j]); printf("\n"); } } }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4265269.html