make pair
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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; }
sort
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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; }
easy problem
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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 MBSubmit: 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; }
再贴一个吧。 暴力过的, 参考学姐代码。
矩形
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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; }