QUST每周训练1

本次周训共6个题,题目和标程如下:

A:涂料求体积

有N块正方形地板,边长为d,现在需要对每块涂色,已知每单位面积地板需要单位体积的涂料。

问一共需要多少体积的涂料呢?

输入格式

第一行输入一个数字Case,表示一共有多少组测试数据。

接下来Case个测试数据块。

每个测试数据块第一行是数字N,表示有N个矩形地板。

接下来一行N个数字,表示每个地板的边长。

Case<=100,1<=N、d<=2012。

 

#include<stdio.h>

int main()

{

    int cases,N,d,sum=0;

    scanf("%d",&cases);

    while(cases>=1)

    {

        N=0;

        d=0;

        sum=0;

        scanf("%d",&N);

        while(N>=1)

        {

            scanf("%d",&d);

            sum+=d*d;

            N--;

        }

        printf("%d\n",sum);

        cases--;

    }

    return 0;

}

 

 

 

 

 

 

 

B:矩形的个数

在N*M的矩形格子里,一共有多少个矩形呢?

 

输入格式

第一行输入一个数字Case,表示一共有多少组测试数据。

接下来Case个测试数据块。

每个测试数据块一行,两个数字N,M。

Case<=10000,1<=N、M<=100。

 

 

#include<stdio.h>

int main()

{

    int n,m,i,ans,Cases;

    m=n=i=ans=Cases=0;

    scanf("%d",&Cases);

    for (i=0;i<Cases;i++)

    {

        scanf("%d",&m);

        scanf("%d",&n);

        ans=n*m*(m+1)*(n+1)/4;

        printf("%d\n",ans);

    }

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C:程序袁的A+B

程序袁今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 
对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于100, 那么程序袁也仅保留计算结果的最后两位.  
例如, 对于程序袁来说: 1) 1234和34是相等的 2) 35+80=15  
给定非负整数A和B, 你的任务是代表程序袁计算出A+B的值.

 

 

#include<stdio.h>

 

int main( )

{

    int n;

    int a, b;

 

    scanf("%d", &n);

    while (n--)

    {

        scanf("%d%d", &a, &b);

        printf("%d\n", (a % 100 + b % 100) % 100);

    }

 

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    D:苦逼的程序袁

程序袁连续加班熬夜多日,头疼欲裂,已经无法完成自己的工作了。他的工作是倒置若干句子,你能帮他完成任务么?

 

第一行是一个数N,表示有N组结果。

后面N行每行是一个句子,如i come from Qingdao.

要求:倒置之后标点位置不变。

 

 

 

 

#include<stdio.h>

 

void Swap(char *a,char *b)

{

    char temp = *a;

    *a = *b;

    *b = temp;

}

/*

反转字符串

*/

void Reverse(char *str,char *begin,char *end)

{

    if(str==NULL || begin==NULL || end==NULL)

        return;

 

    while(begin < end)

    {

        Swap(begin,end);

        begin++;

        end--;

    }

}

/*

反转单词顺序

*/

voidReverseSentence(char *str)

{

    if(str == NULL)

        return;

 

    char *begin = str;

    char *end = str;

    while(*end != '\0')

        end++;

    end--;

    //反转整个字符串

    Reverse(str,begin,end);

 

    //反转每个单词

    begin = str;

    while(*begin == ' ')

        begin++;

    end = begin;

    while(*begin != '\0')

    {

        while(*end!=' ' && *end!='\0')

            end++;

        end--;

        Reverse(str,begin,end);

 

        //跳过多个空格

        end++;

        while(*end == ' ')

            end++;

        begin = end;

    }

}

int main()

{

    char str[50000];

    int N;

    scanf("%d",&N);

    for(int i=0;i<=N;i++)

    {

        gets(str);

        ReverseSentence(str);

        if(i)puts(str);

    }

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E:犁田机器人

描述
因為FJ的田地有树和其他障碍物,所以FJ设定机器人去犁很多不同的长方形。这些长方形允许重叠。他给机器人下了P个指令,每个指令包含一个要犁长方形的地。这片田地由长方形的左下角和右上角坐标决定。他很好奇最后到底有多少个方格的地被犁过了。
一般来说,田地被分割為很多小方格。这些方格的边和x轴或y轴平行。田地的宽度為X个方格,高度為Y个方格 (1 <= X <= 240; 1 <= Y <= 240). FJ执行了I (1 <= I <= 200)个指令,每个指令包含4个整数:Xll, Yll, Xur, Yur (1 <= Xll <=Xur; Xll <= Xur <=X; 1 <= Yll <= Yur; Yll <= Yur <= Y), 分别是要犁的长方形的左下角坐标和右上角坐标。机器人会犁所有的横坐标在Xll..Xur并且纵坐标Yll..Yur范围内的所有方格的地。可能这个长方形会比你想像的多一行一列(就是说从第Xll列到第Xur列一共有Xur - Xll + 1列而不是Xur - Xll列)。
考虑一个6方格宽4方格高的田地。FJ进行了2个操作(如下),田地就被成"*"和"#"了。虽然一般被犁过的地看起来都是一样的。但是标成"#"可以更清晰地看出最近一次被犁的长方形。
    ......               **....                #####.
    ......  (1,1)(2,4) **....  (1,3)(5,4) #####.
    ......               **....                 **....
    ......               **....                 **....
一共14个方格的地被犁过了。

#include<stdio.h>

 int main()

 {

    long int x,y,x1,y1,x2,y2,s,n;

    int a[241][241];

    scanf("%ld%ld %ld",&x,&y,&n);

    for(long int i=1;i<=x;i++)

    {

        for(long int j=1;j<=y;j++)

        {

            a[i][j]=0;

        }

    }

    for(long int i=1;i<=n;i++)

    {

        scanf("%ld%ld %ld %ld",&x1,&y1,&x2,&y2);

        for(int j=x1;j<=x2;j++)

        {

            for(int k=y1;k<=y2;k++)

            {

                a[j][k]=1;

            }

        }

    }

    s=0;

    for(long int i=1;i<=x;i++)

    {

        for(long int j=1;j<=y;j++)

        {

            if(a[i][j])s++;

        }

    }

    printf("%ld",s);

 }

F: 公路乘车

Description

一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。   没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1< =n< =100),它可以通过无限次的换车来完成旅程。最后要求费用最少。

Input

  第一行十个整数分别表示行走110公里的费用(< =500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。         第二行一个整数n表示,旅客的总路程数。

Output

仅一个整数表示最少费用。

 

 

 

我的解法,不能AC,但思路正确。

#include <stdio.h> 

         int L; 

         int a[11],f[101]; 

int main() 

{ 

    int i,j; 

for (i=1;i<=10;i++)

scanf("%d",&a[i]); 

    scanf("%d",&L); 

for (i=1;i<=L;i++)

f[i]=1000000000; 

    f[0]=0; 

    for (i=1;i<=10;i++) 

    { 

        int t=1000000000; 

        for (j=1;j<=L;j++) 

            if (j>=i && f[j-i]+a[i]<f[j])

 f[j]=f[j-i]+a[i]; 

    } 

    printf("%d\n",f[L]); 

    return 0

}

 

 

庆神的正确解法

#include<iostream>

#include<stdlib.h>

#include<cstring>

using namespace std;

int f[110];

int a[11];

int main()

{

    for (int i=1;i<=10;i++)

        {

            cin>>a[i];

            f[i]=a[i];

        }

    int t;

    cin>>t;

    f[0]=0;

    for (int i= 11;i<=t;i++)

        f[i]=0xffffff-1;

    for(int i=1;i<=t;i++)

        for (int j=0;j<min(i,10);j++)

        f[i]=min(f[i],f[i-j]+a[j]);

    cout<<f[t]<<endl;

    return 0;

}

 

 

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值