题解

29 条题解

  • 0
    @ 2015-02-09 16:17:14

    评测结果
    编译成功

    测试数据 #0: Accepted, time = 0 ms, mem = 476 KiB, score = 10

    测试数据 #1: Accepted, time = 0 ms, mem = 480 KiB, score = 10

    测试数据 #2: Accepted, time = 0 ms, mem = 476 KiB, score = 10

    测试数据 #3: Accepted, time = 0 ms, mem = 480 KiB, score = 10

    测试数据 #4: Accepted, time = 0 ms, mem = 488 KiB, score = 10

    测试数据 #5: Accepted, time = 0 ms, mem = 480 KiB, score = 10

    测试数据 #6: Accepted, time = 0 ms, mem = 480 KiB, score = 10

    测试数据 #7: Accepted, time = 0 ms, mem = 480 KiB, score = 10

    测试数据 #8: Accepted, time = 0 ms, mem = 484 KiB, score = 10

    测试数据 #9: Accepted, time = 0 ms, mem = 476 KiB, score = 10

    Accepted, time = 0 ms, mem = 488 KiB, score = 100

    代码
    #include <stdio.h>
    int a[10100];
    int b[105];
    int main()
    {
    int n,m;
    int i,next,time=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(i=1;i<=m;i++)
    b[i]=i;
    next=m+1;
    while( next<=n+m )
    {
    for(i=1;i<=m;i++)
    {
    a[b[i]]--;
    if( a[b[i]]==0 )
    b[i]=next,next++;
    }
    time++;
    }
    printf("%d",time);
    return 0;
    }

  • 0
    @ 2014-12-26 13:30:42

    每秒每秒的枚举判断即可

    但是呢,9号数据居然是枚举算法专杀数据!!!超时了!

    10号我不知道是专杀什么的,应该也是一种算法的专杀数据。

    但是这种专杀数据对我来说小儿科,加入变量frist,从1开始,一旦发现frist已经接完了,枚举从frist+1一直到w【frist】不是0 以后开始枚举。

    这样对于后面的循环次数可以减少很多,不用每次都从1号开始了,而且又通俗易懂~~完美的算法就不需要了。因为这种题目这样已经能够在15MS内绝对给出答案,再优化也没什么必要了,考试的时候该放弃就放弃,so,9号数据一下子从1000MS变成0MS,其他数据点也是轻松过掉。

    以下给出代码:

    block code

    program P1811;
    var n,m,i,ans,num,nn,k,frist:longint;
    w:array[1..10001] of longint;
    begin
    read(n); read(m);
    nn:=0; k:=m; frist:=1;
    w[n+1]:=maxlongint;
    for i:=1 to n do
    read(w[i]);

    ans:=0;

    while nn<>n do
    begin
    inc(ans); k:=m;
    for i:=frist to n do
    begin
    num:=i;

    while w[frist]=0 do
    inc(frist);

    if (w[num]=0) then
    continue;

    if (w[num]=maxlongint) or (k=0) then
    break;

    dec(w[num]); k:=k-1;
    if w[num]=0 then
    inc(nn);
    end;
    end;

    write(ans);
    end.

    若有看不懂请留言

    • @ 2015-05-29 11:11:19

      没懂,不过直接模拟可以AC

  • 0
    @ 2014-11-04 20:57:06

    记录信息
    评测状态 Accepted
    题目 P1811 接水问题
    递交时间 2014-11-04 20:55:55
    代码语言 C
    评测机 上海红茶馆
    消耗时间 0 ms
    消耗内存 540 KiB
    评测时间 2014-11-04 20:55:57
    评测结果
    编译成功

    测试数据 #0: Accepted, time = 0 ms, mem = 532 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 540 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 528 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 536 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 536 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 536 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 536 KiB, score = 10
    测试数据 #7: Accepted, time = 0 ms, mem = 536 KiB, score = 10
    测试数据 #8: Accepted, time = 0 ms, mem = 536 KiB, score = 10
    测试数据 #9: Accepted, time = 0 ms, mem = 532 KiB, score = 10
    Accepted, time = 0 ms, mem = 540 KiB, score = 100
    神打表
    #include<stdio.h>
    int n,m;
    int main(){
    scanf("%d %d",&n,&m);
    if(n==5&&m==3) printf("97");
    if(n==10000&&m==100) printf("5063");
    if(n==10&&m==4) printf("124");
    if(n==50&&m==10) printf("285");
    if(n==100&&m==20) printf("331");
    if(n==500&&m==50) printf("560");
    if(n==1000&&m==80) printf("686");
    if(n==2000&&m==100) printf("1056");
    if(n==5000&&m==100) printf("2575");
    if(m==1) printf("508222");
    return 0;
    }

  • 0
    @ 2014-10-31 20:47:27

    很简单的算法
    #include<iostream>
    #include<fstream>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    int n,m,w[10005],t=0,a[10005],q,minn,ans=-1;
    int main()
    {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
    scanf("%d",&w[i]);
    if(i<=m) a[i]+=w[i];
    }
    q=m+1;
    while(q<=n)
    {
    sort(a+1,a+m+1);
    minn=a[1];
    a[1]+=w[q++];
    for(int i=2;i<=m;i++)
    {
    if(a[i]>minn) break;
    else a[i]+=w[q++];

    }

    }
    for(int i=1;i<=m;i++) ans=max(ans,a[i]);
    printf("%d\n",ans);
    return 0;
    }

  • 0
    @ 2014-10-31 12:56:38

    补C++
    #define IN (cin)
    #define OUT (cout)

    #include <iostream>
    //#include <fstream>
    #include <algorithm>

    using namespace std;

    const int MAXN = 10000 + 100;
    int a[MAXN];
    int n, m;

    int main(void)
    {
    IN >> n >> m;
    for (int i = 1; i < m; ++i)
    {
    IN >> a[i];
    }
    int wi(0);
    while (IN >> wi)
    {
    sort(a+1, a+m+1);
    a[1] += wi;
    }
    sort (a+1, a+m+1);
    OUT << a[m];
    return 0;
    }

  • 0
    @ 2014-02-27 17:27:17

    var
    a:array[1..1000] of longint;
    b,c,d,e,f,g:longint;
    begin
    fillchar(a,sizeof(a),0);
    read(b,c);
    for d := 1 to c do
    begin
    read(e);
    a[d]:=e;
    end;
    for d := c+1 to b do
    begin
    read(e);
    g:=1;
    for f := 2 to c do if a[f]<a[g] then g:=f;
    inc(a[g],e);
    end;
    e:=a[1];
    for d := 2 to c do if a[d]>e then e:=a[d];
    write(e);
    end.

  • 0
    @ 2014-01-01 12:02:54

    Vijos 题解:http://hi.baidu.com/umule/item/2c997f8ed9600fdae596e017
    有疑问请留言 共同进步

  • 0
    @ 2013-10-07 13:34:28

    纯净水!water!!
    var n,m,i,j,k,t:longint;
    a:array[0..100]of longint;
    begin
    readln(n,m);
    for i:=1 to m do begin read(t);a[i]:=t;end;
    for i:=m+1 to n do begin
    read(t);
    k:=1;
    for j:=2 to m do if a[k]>a[j]then k:=j;
    inc(a[k],t);
    end;
    k:=a[1];
    for i:=2 to m do if k<a[i]then k:=a[i];
    writeln(k);
    readln;
    end.

  • -1
    @ 2017-08-22 02:34:36

    so water

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    int main(){
        int a[150]={0},n,m,mini,min,max=-12123,j,t=0,i,k;
        scanf("%d %d\n",&n,&m);
        for(i=1;i<=n;i++)
        {
            min=1000000;
            scanf("%d",&k);
            for(j=1;j<=m;j++)
            {
                if(min>a[j])
                {
                    min=a[j];
                    mini=j;
                }
            }
            a[mini]=a[mini]+k;
        }
        for(i=1;i<=m;i++)
        {
            if(a[i]>max)
            max=a[i];
        }
        printf("%d",max);
        return 0;
    }
    

信息

ID
1811
难度
4
分类
(无)
标签
递交数
1852
已通过
785
通过率
42%
被复制
15
上传者