贴几个模拟题(zzuli校赛)

make pair

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 59  Solved: 43

SubmitStatusWeb Board

Description

pair<T,T>是c++标准模板库中一种十分有用的模板类型,它是一个二元组。我们可以用它来表示一个二维坐标点,人的身高体重等等。make_pair()函数可以方便地构造一个pair。

现在有一个长度为n的整数数组a1~an(可以存在相同的元素),将每两个元素(包括自身)make_pair(),一定能得到n2个pair。例如,[1,2,3]make_pair()后,将得到{[1,1],[1,2],[1,3], [2,1],[2,2],[2,3], [3,1],[3,2],[3,3]}。

问题是这样的,在构造出了n2个pair后,升序排序(先按第一维排序,若第一维相等,再按第二维排序),你能找到排序后的第k个元素吗?

Input

多组数据。

第一行,2个整数n和k (1<=n<=10000,1<=k<=n^2)。

第二行,n个整数,即原数组a1~an(1<=ai<=1000000000)。

Output

对于每组数据,输出两个整数,排序后的第k个pair。

Sample Input

2 4
2 1
3 2
3 1 5

Sample Output

2 2
1 3

HINT

 

Source

郑大第九届校赛热身赛

规律题, 热个身。

#include <cstdio> 
#include <algorithm> 
using namespace std; 
int num[10001]; 
int main(){ 
    int n, k; 
    while(~scanf("%d%d", &n, &k)){ 
        for(int i = 0; i < n; i++) 
            scanf("%d", &num[i]); 
        sort(num, num+n); 
        int a = k/n; 
        if(a != 0) 
            a -= 1; 
        int b = k%n; 
        if(b == 0) 
            b = n-1; 
        else 
            b -= 1; 
        printf("%d %d
", num[a], num[b]); 
    } 
    return 0; 
} 
View Code

sort

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 144  Solved: 23

SubmitStatusWeb Board

Description

想必大家对排序已经很熟悉了,但是spy好像对排序不太熟悉,有一天,他看到这样一个关于排序的题目:

对于 k 个用空格分隔开的整数,依次为 n1, n2 … nk。请将所有下标不能被 3 但可以被 2 整除的数在这些数字原有的位置上进行升序排列,此外,将余下下标能被 3 整除的数在这些数字原有的位置上进行降序排列。

spy想了半天不知道怎么排序,你可以帮助他么?

Input

多组数据,每组数据一行,为k个小于1000的正整数,依次为 n1, n2 … nk。(1 <= k <= 100000)

Output

对于每组数据,输出排序后的结果。

Sample Input

1 3 4 2 10 6 8

Sample Output

1 2 6 3 10 4 8

HINT

 

Source

郑大第九届校赛正式赛

看题有点懵B,其实也没什么,  加两个辅助数组排一下序, 就是输出时判断一下

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100001;
int num[N], a[N], b[N];
bool cmp(int a, int b){
    return a > b;
}
int main(){
    int k = 0, c = 0, d = 0;
    while(scanf("%d", &num[k++])!=EOF){    //注意输入格式, 很巧妙。 
        char e = getchar();
        if(e == ' ')
            continue;
        else{
            for(int i = 1; i <= k; i++){
                if(i%2==0 && i%3!=0)
                    a[c++] = num[i-1];
                if(i%3 == 0)
                    b[d++] = num[i-1]; 
            }
        }
        sort(a, a+c);
        sort(b, b+d, cmp);
        c = 0; d = 0;
        for(int i = 1; i <= k; i++){
            if(i != 1)
                printf(" ");
            if(i%2 == 0 && i%3 != 0)
                printf("%d", a[c++]); 
            else if(i%3 == 0)
                printf("%d", b[d++]);
            else
                printf("%d", num[i-1]);
        }
        printf("
");
        k = 0;  c = 0; d = 0;
    }
    return 0;
} 
View Code

easy problem

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 97  Solved: 47

SubmitStatusWeb Board

Description

给你一个数字N,N的范围是1~1000000,求一个最小的正整数M,这个数字M的各个位的数字加上它本身之和恰好为N。当然,如果没有解,输出0。

Input

输入数据由多组数据组成,每行由一个数字N组成(1<=N<=1000000)。

Output

对于每组数据,输出仅一行包含一个整数M。如果对于每个N,存在最小的M,则输出这个最小值。如果不存在这个最小的M,则输出0。

Sample Input

216 
121 
2005

Sample Output

198
0
1979

HINT

 

Source

郑大第九届校赛正式赛

其实就一个条件就是加上各位数字之和, 怪自己太水。

加加加!(油)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 72  Solved: 42

SubmitStatusWeb Board

Description

实验室的小D同学又开始玩游戏了,这次他的游戏貌似很高级的样子。首先他在一张纸上写下了一个数n,然后他在两个无差别的球上写上两个数分别是a和b,他把两个球放在一个黑色的袋子中,然后他会从袋子中随机取出来一个球,并将这个n改变成n和这个球上标记的数的和。

是不是很简单!是不是很有意思!是不是很神奇!

(不是!)

好吧,这不是问题的所在,问题的所在是小d这个过程中n都有可能是些什么值。

Input

输入的第一行包含一个K,代表输入样例组数。

每组样例只有一行,包含四个整数"n a b m",n,a,b的含义为题目描述中的含义,m代表小D随机从袋子中取球的次数。(0 <= n < 1000000,0 <= a < 100000,0 <= b < 100000, 0 <=m < 10)

Output

把所有可能出现的n按照升序输出(不允许重复)。注意只有两个连续的数中间才允许空格,结尾不允许有空格。

Sample Input

3
1 1 1 1
4 2 3 2
5 100 102 1

Sample Output

1 2
4 6 7 8 9 10
5 105 107

HINT

 

Source

郑大第九届校赛正式赛

这个好, 两个球, 取得次数确定, 两个球被取次数一定。 

#include <cstdio>
#include <algorithm>
using namespace std;
int num[2050];
int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        int a, b, m;
        scanf("%d%d%d%d", &num[0], &a, &b, &m);
        int n = num[0];
        int  j = 1;
        for(int k = m; k >= 0; k--)
            for(int i = 0; i <= k; i++)    
                num[j++]=num[0]+i*a+(k-i)*b;
        sort(num, num+j);
        printf("%d", num[0]);
        int temp = num[0];
        for(int i = 1; i < j; i++)
            if(num[i] != temp){
                printf(" %d", num[i]);
                temp = num[i];            
        }
        printf("
");
    } 
    return 0;
}
View Code

再贴一个吧。 暴力过的, 参考学姐代码。

矩形

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 95  Solved: 26

SubmitStatusWeb Board

Description

小S和小D两个小雪参,在玩一个关于矩形的游戏以帮助他们学会怎么计算矩形的面积然后完成作业去打游戏(两个小雪参一起打游戏你怕不怕!)。他们约定每个人给出两个坐标,分别是两个矩形的左下角和右上角的坐标,他们的游戏规则很简单,就是看谁先找出来这两个矩形的覆盖的总面积大小。你的问题就是帮助他们给出正确答案。

Input

输入的第一行为一个整数T,代表样例的组数。

每组样例包含4个坐标(x,y),( -100000000<= x,y <= 100000000 )前两个是小S给出的矩形左下角和右上角的坐标,后面两个是小D给出来的坐标。

Output

输出两个矩形覆盖的总面积大小。

Sample Input

3
-2 -2 2 2 -2 -2 2 2
0 0 1 1 0 0 2 2
-2 -2 2 2 1 -3 3 -1

Sample Output

16
4
19

HINT

 

Source

郑大第九届校赛正式赛

代码如下 出自纯真学姐: 

#include<cstdio>
#include<cstdlib>
#include<cstring>
struct node
{
    long long x,y;
}a[5],b[5];

int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&a[0].x,&a[0].y,&a[1].x,&a[1].y,&b[0].x,&b[0].y,&b[1].x,&b[1].y);
        //a[2].x=a[0].x;  a[2].y=a[1].y;
        //b[2].x=b[0].x;  b[2].y=b[1].y;
        //a[3].x=a[1].x;  a[3].y=a[0].y;
        //b[3].x=b[1].x;  b[3].y=b[0].y;
        long long ax=abs(a[1].x-a[0].x);
        long long ay=abs(a[1].y-a[0].y);
        long long as=ax*ay;
        long long bx=abs(b[1].x-b[0].x);
        long long by=abs(b[1].y-b[0].y);
        long long bs=bx*by;
        long long cx=0,cy=0;
        if(a[0].x<=b[0].x&&a[1].x>=b[1].x)
        {
            cx=bx;
            if(a[0].y>=b[0].y&&a[1].y<=b[1].y)
                cy=ay;
            if(a[0].y<=b[0].y&&a[1].y>=b[0].y&&b[1].y>=a[1].y)
                cy=a[1].y-b[0].y;
            if(a[0].y>=b[0].y&&a[0].y<=b[1].y&&a[1].y>=b[1].y)
                cy=b[1].y-a[0].y;
            if(a[0].y<=b[0].y&&a[1].y>=b[1].y)
                cy=by;
        }
        else if(a[0].x<=b[0].x&&b[0].x<=a[1].x&&a[1].x<=b[1].x)
        {
            cx=a[1].x-b[0].x;
            if(a[0].y>=b[0].y&&a[1].y<=b[1].y)
                cy=ay;
            if(a[0].y<=b[0].y&&a[1].y>=b[0].y&&b[1].y>=a[1].y)
                cy=a[1].y-b[0].y;
            if(a[0].y>=b[0].y&&a[0].y<=b[1].y&&a[1].y>=b[1].y)
                cy=b[1].y-a[0].y;
            if(a[0].y<=b[0].y&&a[1].y>=b[1].y)
                cy=by;
        }
        else if(b[0].x<=a[0].x&&a[0].x<=b[1].x&&b[1].x<=a[1].x)
        {
            cx=b[1].x-a[0].x;
            if(a[0].y>=b[0].y&&a[1].y<=b[1].y)
                cy=ay;
            if(a[0].y<=b[0].y&&a[1].y>=b[0].y&&b[1].y>=a[1].y)
                cy=a[1].y-b[0].y;
            if(a[0].y>=b[0].y&&a[0].y<=b[1].y&&a[1].y>=b[1].y)
                cy=b[1].y-a[0].y;
            if(a[0].y<=b[0].y&&a[1].y>=b[1].y)
                cy=by;
        } 
        else if(a[0].x>=b[0].x&&a[1].x<=b[1].x)
        {
            cx=ax;
            if(a[0].y>=b[0].y&&a[1].y<=b[1].y)
                cy=ay;
            if(a[0].y<=b[0].y&&a[1].y>=b[0].y&&b[1].y>=a[1].y)
                cy=a[1].y-b[0].y;
            if(a[0].y>=b[0].y&&a[0].y<=b[1].y&&a[1].y>=b[1].y)
                cy=b[1].y-a[0].y;
            if(a[0].y<=b[0].y&&a[1].y>=b[1].y)
                cy=by;
        }
        long long cs=cx*cy;
        long long ans=as+bs-cs;
        printf("%lld
",ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/soTired/p/5031270.html