高木さんBlog高木さん

Day1 备战CCF-CSP练习

高木さん·2024-10-08 15:55·28 次阅读

Day1 备战CCF-CSP练习

Day 1

201403-1

题目描述#

N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(aa 为一对相反数)。

输入格式#

第一行包含一个正整数 N(1N500)
第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
  

输出格式#

  只输出一个整数,即这 N 个数中包含多少对相反数。

样例输入#

Copy
5 1 2 3 -1 -2

样例输出#

Copy
2

题目分析#

语法题
保证输入整数互不相同,所以直接看输入的数的相反数是否存在即可(哈希表,标记都可)

C++代码#

Copy
#include <bits/stdc++.h> using namespace std; map<int , int> p; int main() { int n; cin >> n; int cnt = 0; while (n -- ) { int x; cin >> x; if(p[abs(x)]) cnt ++; else p[abs(x)] ++; } cout << cnt << '\n'; return 0; }

201403-2

题目描述#

在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。

窗口的边界上的点也属于该窗口。

窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。

当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。

如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。

现在我们希望你写一个程序模拟点击窗口的过程。

输入格式#

输入的第一行有两个正整数,即 NM

接下来 N 行按照从最下层到最顶层的顺序给出 N 个窗口的位置。

每行包含四个非负整数 x1,y1,x2,y2,表示该窗口的一对顶点坐标分别为 (x1,y1)(x2,y2)。保证 x1<x2,y1<y2

接下来 M 行每行包含两个非负整数 x,y,表示一次鼠标点击的坐标。

题目中涉及到的所有点和矩形的顶点的 x,y 坐标分别不超过 25591439

输出格式#

输出包括 M 行,每一行表示一次鼠标点击的结果。

如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1
编号到 N

如果没有,则输出 IGNORED

数据范围#

1N,M10

输入样例:#

Copy
3 4 0 0 4 4 1 1 5 5 2 2 6 6 1 1 0 0 4 4 0 5

输出样例:#

Copy
2 1 1 IGNORED

样例解释#

第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2个窗口在上面,它被选择并且被置于顶层。

第二次点击的位置只属于第 1个窗口,因此该次点击选择了此窗口并将其置于顶层。现在的三个窗口的层次关系与初始状态恰好相反了。

第三次点击的位置同时属于三个窗口的范围,但是由于现在第 1
个窗口处于顶层,它被选择。

最后点击的 (0,5)
不属于任何窗口。

题目分析#

大模拟题,因为数据量很小模拟就行

C++ 代码#

Copy
#include <bits/stdc++.h> #define x first #define y second using namespace std; typedef pair<int, int> PII; const int N = 11; pair<PII , PII> point[N]; map<pair<PII , PII> , int> mp; int n , m; int main() { cin >> n >> m; for(int i = 0 ; i < n ; i ++) { cin >> point[i].first.x >> point[i].first.y >> point[i].second.x >> point[i].second.y; mp[point[i]] = i + 1; } while(m --) { int px , py; cin >> px >> py; int ans = 0 , idx = -1; pair<PII , PII> t; for(int i = 0 ; i < n ; i ++) if(px >= point[i].first.x && px <= point[i].second.x && py >= point[i].first.y && py <= point[i].second.y) ans = mp[point[i]] , t = point[i] , idx = i; if(ans == 0) cout << "IGNORED" << '\n'; else { cout << ans << '\n'; for(int i = 0 ; i < n ; i ++) if(i > idx) point[i - 1] = point[i]; point[n - 1] = t; } } }
posted @   她说戴了不算給  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
目录