2019年暑假集训第十三套题

问题 A: 军训方阵

题目描述

不知不觉军训已过半,又到了分方阵的时候,其中花样方阵因为其男女搭配作舞伴而广受欢迎。花样方阵最主要的就是变换阵型,并摆出精心设计的图案。为了简化模型,假设n位同学处于方格中,
其中第?i名同学位于第xi行第yi列,现在需要进行变换,变换后第i名同学需要站在第ai行第bi列。在变换过程中所有人只能向上下左右四个方向,每秒移动一格,并且所有人的移动互不影响,即同一格子可以同时站下多人。
教官ctr想知道这次变换总共需要花费多少秒,你能告诉他吗?

输入

输入第一行为一个整数T(1 <=T <= 20),表示一共有T组测试数据。
对于每组测试数据:
第一行为一个整数n(1<=n <= 100),表示方阵中有n名同学。
接下来的n行,每行为4个整数xi,yi,ai,bi(1 <=xi,yi,ai,bi <= 1000),表示变换前和变换后的位置。

输出

对于每组测试数据,输出一个整数表示花费的时间。

样例输入

1
3
2 4 6 8
1 2 3 4
5 2 3 7

样例输出

8

题解:

c++语言基础题!!!

源代码:

#include<bits/stdc++.h>
using namespace std;
int s[105];
int main()
{
    int t;
    int x,y,a,b;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int maxx=-1;
        for(int i=1;i<=n;i++)
        {
            cin>>x>>y>>a>>b;
            s[i]=abs(a-x)+abs(b-y);
            maxx=max(maxx,s[i]);
        }
        cout<<maxx<<endl;
    }
} 

问题 B: 礼物

题目描述

cc最近收到了好多礼物,对着满地大小不一的礼物,她想要一个包来装,于是dd就掏出了一个会说话的神奇揹包给cc装礼物。
cc为了一次性装尽可能多的礼物,于是跟这个揹包定下了一个规则,对每个礼物,揹包会给出它对这件礼物的喜爱程度,揹包越喜欢这个礼物,它就会越开心,越开心,它就会扩大自己的容量。
于是问题就变成了这样:每个礼物都有自己的体积ai,揹包也会给出它对这些礼物的喜爱程度bi,并且为了方便cc计算,揹包告诉cc,喜爱程度bi就是这件物体放进揹包,揹包后会扩大的体积。
那么现在cc想知道,对这一地的礼物,有没有某种放的顺序,可以一次性把所有礼物都放进包里?
当然,物体要先放进揹包,揹包才会扩大自己的体积
比如当前揹包的剩余体积为2,礼物的体积为3,喜爱程度为4,也是不能放进揹包的。

输入

输入包含多组数据,第一行为一个整数T(1<=T<=20)
每组数据第一行包含两个整数n,v表示共有n个礼物,揹包一开始的体积为v
接下去的n行每行包含两个整数ai,bi表示每个礼物的体积ai与揹包对这件礼物的喜爱程度bi
1 <= T <= 20
1 <= n, v <= 100000
1 <= ai, bi <= 100000

输出

若存在一种放礼物的顺序可以让cc把所有礼物放进揹包,则输出"yes"否则输出"no"(引号不包含在内)

样例输入

1
4 2
1 2
2 1
3 1
2 3

样例输出

yes

题解:

一道贪心题,先把能够增加揹包空间的放进揹包,如果都能增加,那么将

消耗揹包空间小的放进揹包,这样就是揹包空间的最大值,最后判断即可。

源代码:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w,c;
}a[200005];
int v,n;
int cmp(node a,node b)
{
    if(a.c-a.w>=0&&b.c-b.w<=0)return 1;
    else if(a.c-a.w<0&&b.c-b.w>0)return 0;
    else return a.w<b.w;//若两个都可以增加揹包空间
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>v;
        for(int i=1;i<=n;i++)cin>>a[i].w>>a[i].c;
        sort(a+1,a+1+n,cmp);
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            if(v-a[i].w<0)//不是v<0
            {
                flag=1;
                break;//注意break,不然会TLE
            }
            v=v-a[i].w+a[i].c;
        }
        if(flag==1)cout<<"no"<<endl;
        else cout<<"yes"<<endl;
    }
}

问题 C: 发题目3

题目描述

陈老师今天心情很好,所以他又想给他的学生发题目了,陈老师囤积了很多很好的题目,每一题都有一个唯一的编号,但是存题目的U盘被陈老师弄丢了,好在陈老师把所有题目都打印了出来,每一题都分别打印在不同的纸上,可惜的是每一题都只打印了一份。  

由于题目难度不同,适合做的学生也不一样,所以陈老师不想把题目随便发给学生,他找你来帮忙把题目分发给学生,陈老师会给你一些指令,你只需要按照陈老师给的指令把某一题发给某一个学生就行了。  

但是由于题目是在太多了,陈老师记性又不好,有时候会把某一道之前已经给别人的题再让你给某一位学生,这时候你要像陈老师报告,告诉陈老师这题之前已经给了哪个学生。 

最后,陈老师想知道每个学生分别分到了多少题,希望你能帮他统计一下。 

输入

输入文件为“ti.in” 
输入第一行为两个正整数n和m,分别表示陈老师学生的数量(学生按照1到n编号)和陈老师给你的指令的数量 

接下来m行每行有两个正整数a和b,表示一个指令,含义为把编号为b的题目发给编号为a的学生。 

输出

输出文件为“ti.out” 
对于每一个指令,如果要发的题目之前已经发给某个学生了(包括自己),请输出两个用空格隔开的整数分别表示这题的编号和获得这题的学生的编号,并换行;否则不输出。 

处理完所有指令后,请在最后一行输出n个用空格隔开的正整数,第i个整数表示编号为i的学生分到的题目的数量 

(注意:由于每道题目都只有一份,所以一道题如果已经给了某个学生,那么只有该学生拥有这道题,别人无法再得到它,该学生也只能得到一份这道题目,即如果有多个指令把同一道题给同一个学生,该学生只能得到一份该题目) 

样例输入

3 5
1 1
1 1
3 2
2 1
2 2

样例输出

1 1
1 1
2 3
1 0 1

提示

【样例解释】 

一号学生分到了编号为1的题,给2号学生的题都已经先行给了别人,所以2号没有分到题目,3号学生分到了编号为2的题 

【数据范围】 

对于50%的数据,1 <= n, m <= 10, 1 <= 题目编号 <= 10
对于100%的数据,1 <= n <= 10, 1 <= m <= 100000, 题目编号为int范围内正整数 

不是AC的题解:

这题我只会暴力,结果TLE,50分

先贴上:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int a,b;
    int s;
}s[100005],sum[105];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>s[i].a>>s[i].b;
    int flag=0;
    memset(sum,0,sizeof(sum));
    int t;
    for(int i=1;i<=m;i++)
    {
        flag=0;
        t=s[i].a;
        for(int j=1;j<i;j++)
        {
            if(s[j].b==s[i].b)
            {
                cout<<s[j].b<<" "<<s[j].a<<endl;
                //system("pause");
                //cout<<j<<" ";
                flag=1;
                break;
            }
        }
        if(flag==0)sum[t].s++;
    }
    for(int i=1;i<=n;i++)cout<<sum[i].s<<" ";
}

 

发布了57 篇原创文章 · 获赞 12 · 访问量 4838
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章