Coderforces 509B

背景:开始没有仔细想,后来@liu_jc 说简单遂1Y

思路:找出最大堆的鹅卵石数为max,最小堆数为min。如果max-min>=k,则成立。

证明:对最大堆编号为:a1,a2,a3~amin-1,amin~amax .对最小堆编号为:b1,b2~bmin.

让a1和b1,a2和b2,......,amin和bmin颜色一样。

对于剩下的amin+1~amax 鹅卵石不能出现重复颜色,一旦出现就会是2-0>1.

所以:剩下的石头数必须小于k.    得证。

至于其他鹅卵石数在最小和最大数之间的很容易证明可行。

至于对每一个鹅卵石的涂色,直接循环涂1~k,即可,这样最均衡。

学习:比赛的时候要深入思考,必须要用草稿纸,在头脑里空想是不够的。

我的代码:

#include<stdio.h>
#include<string.h>

int main(void){<span id="transmark"></span>
    int t,k,str[100];
    while(~scanf("%d%d",&t,&k)){
        int min=100000,max=0;
        for(int i=0;i < t;i++){
            scanf("%d",&str[i]);
            if(str[i] < min) min=str[i];
            if(str[i] > max)  max=str[i];
        }
        if(max-min <= k){
            printf("YES\n");
            for(int i=0;i < t;i++){
                for(int j=0,kk=0;j < str[i];j++,kk++){
                    if(j) printf(" ");
                    printf("%d",kk%k+1);
                }
                printf("\n");
            }
        }else printf("NO\n");

    }
	  return 0;
}
时间: 2024-10-10 12:58:09

Coderforces 509B的相关文章

coderforces #284(Div.2)

背景:第一次打coderforces,只出了a,b两题·,c题在会长指导下过. A:水 B:简单字符串处理 C: 题意是从A到B,不能走交叉点,求A到B最少要走的步数,等价于求与线段AB相交的直线个数. 证明:由于从A到B不能走直线交叉点,所以必须跨过其线段间的所有直线,每条直线只走一步就是最少. 解法:由于告诉了所有直线方程,只需根据若两点在直线异侧则直线在线段间.

贪心/CoderForces 228c Fox and Box Accumulation

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int a[110]; 6 int main() 7 { 8 int n; 9 scanf("%d",&n); 10 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 11 sort(a+1,a+n+1);

Coderforces 633D:Fibonacci-ish(map+暴力枚举)

http://codeforces.com/problemset/problem/633/D D. Fibonacci-ish Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if the sequence consists of at least two elements f0 and f1 are arbi

CoderForces 280B(记忆化搜索)

题目大意:一个纸牌游戏,52张纸牌排成一列,每张纸牌有面值和花色两种属性.每次操作可以用最后一张纸牌将倒数第二张或者倒数第四张替换,但前提是两张牌的花色或者面值相同.问最终能否只剩一张牌. 题目分析:取当前所剩纸牌张数和最后三张牌作为状态,显然深搜要超时.记忆化搜索即可. 代码如下: # include<iostream> # include<string> # include<cstdio> # include<cstring> # include<

CoderForces 327D Block Tower

Portal:http://codeforces.com/problemset/problem/327/D 一座红塔200人,一座蓝塔100人,只有与蓝塔相邻才可以建红塔. '.'处可建塔 '#'处不可建塔 可以随便毁塔 在建造能够容纳最多人数的塔集合情况下,输出对塔的操作(SPJ) 这是一道水题 这是一道卡输入输出的题 DFS就好,反正就是在联通分量里炸割顶留根 1 #include<iostream> 2 #include<algorithm> 3 #include<se

coderforces Gym 100803A/Aizu 1345/CSU 1536/UVALive 6832 Bit String Reordering(未完)

Portal: http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1345  http://codeforces.com/gym/100803/attachments  A题 好题! 坑不多,切入比较难 一开始的想法是暴力,由于求得是最小解且此图太大无边界,所以不能DFS,首先想到BFS 解法1 BFS+STL queue 1 #include<iostream> 2 #include<algorithm> 3 #in

Coderforces 509A

背景:esay 学习: 1.杨辉三角与组合数与二项式公式: a:二项式公式:,组合数是二项式公式的系数,而杨辉三角是组合数的图形表示. b:组合数公式:                                                                                                                                                                              

coderforces 507A 贪心简单

背景:比赛时明显小看了第一题的难度,就想的一心ac,结果wa了三次,!!!!!!比赛就乱了!!要稳住,多给时间看题!!! 思路:排序从最小的开始依次来减.但是要记录之前的位置,因为最终输出的是位置.我的记录方法是,把未排序之前的数组复制一份为sstr,对str排序之后,想要知道str中某个 #include<stdio.h> #include<algorithm> using namespace std; int main(void){ int n,k,str[105],ans[1

CoderForces 518C Anya and Smartphone (模拟)

题意:给定一个手机,然后一共有 n 个app,告诉你每个屏幕最多放 k 个,现在要你运行 m 个app,每次都从第一个屏幕开始滑动,每运行一个,它就和前一个交换位置,第一个就不换了,现在问你要滑动多少次. 析:这个题,没什么算法,就是模拟呗,不过要注意时间,不能TLE,所以我们就得提前把所有的位置都存下来,让查找的时间变成 O(1),否则就会超时,可以用两个数组,也可以用map,一个存编号,一个存位置, 然后运行完后再交换就行了. 代码如下: #include <iostream> #incl