Day 1的题难度上来说不算太高,但是T2和T3还是有一定的思维量的。
一个比较好的开始。虽然AK的人只有几个。。
(懒得去翻result了。。忘了当时拿了多少分了
(哦,前两天我们机房是没有成绩的,我好像忘了这一点。
 
那么我们直奔主题吧。
 
T1:删除
文件名
del.cpp/c/pas
输入文件 输出文件 时间限制 空间限制
del.in del.out 1s 512MB
题目描述
现在,我的手上有 n 个数字,分别是 a1, a2, a3, ..., an
我现在需要删除其中的 k 个数字。当然我不希望随随便便删除,我希望删除 k个数字之后,剩下的 n − k 个数中有最多的不同的数。
输入格式
第一行两个正整数 n 和 k,含义如题目描述。
接下来一行,有 n 个非负整数,分别是 a1到 an
输出格式
一共一行,一个整数 ans,表示删除了 k 个数字后最多的不同的数的个数。
样例输入
4 1
1 3 1 2
样例输出
3
样例解释
如果删去第一个 1:
在[3,1,2]中有 3 个不同的数
如果删去 3:
在[1,1,2]中有 2 个不同的数
如果删去第二个 1:
在[1,3,2]中有 3 个不同的数
如果删去 2:
在[1,3,1]中有 1 个不同的数
数据范围
对于 30% 的数据,n ≤ 10,a ≤ 10。
对于 60% 的数据,n ≤ 100,a ≤ 100。
对于 80% 的数据,n ≤ 105,a ≤ 105
对于 100% 的数据,n ≤ 105,a ≤ 109
 
这道题算是比较基础的一道题了。当时我在考场上想到了一个自认为是正解的做法,但下午讲解时被告知是80分的伪正解做法。。
我太菜了.jpg
我当时想的是,开一个数组,统计每个数字出现的次数,既然我们要删除k个数字而且要保证删除后的数字是最多的,那很显然想到要先删除重复的。
统计一下有多少个重复的数字,将这个数与k比较。
如果k比这个数小或者等于这个数,那说明我们删除k个数对数字的种类没有任何影响。我们仅仅删除了重复的数字而已。那么答案就是数字的种数。
如果k比这个数字大,那说明我们即使全部删除所有的重复数字,也达不到k这个值,那只好再去删除不重复的数字,我们无需关心到底是删除了哪个数,而只需要统计出数字有多少种即可。
假设有m种数字,删除k个数,设x等于删除完所有重复数字后还需要删除多少数,那么根据上边的分析,答案应该是m-x.
 
100分做法:
善用排序。我们完全可以不用统计每个数字出现的次数,只需要读入之后sort(salt)一下,这样相同的数字会排在一起,我们就能统计出有多少相同的数字可供删除,以及数字的种类。
 
GTY哥哥的std:
 #include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std; const int max_n = 1e5 + ;
int n, k, a[max_n]; int main() {
freopen("del.in", "r", stdin);
freopen("del.out", "w", stdout); cin >> n >> k; for (int i = ; i <= n; i++)
cin >> a[i]; sort(a + , a + + n); int multi = ;
for (int i = ; i <= n; i++)
if (a[i] == a[i - ]) multi++;
if (k <= multi) cout << n - multi << endl;
else cout << n - multi - (k - multi) << endl;
}
 
 
T2:同花顺
题目描述
所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续。
现在我手里有 n 张扑克牌,但它们可能并不能凑成同花顺。我现在想知道,最少更换其中的多少张牌,我能让这 n 张牌都凑成同花顺?
输入格式
第一行一个整数 n,表示扑克牌的张数。
接下来 n 行,每行两个整数 a 和 b 。其中 ai表示第 i 张牌的花色,bi表示第i 张牌的数字。
输出格式
一行一个整数,表示最少更换多少张牌可以达到目标。
样例输入 1
5
1 1
1 2
1 3
1 4
1 5
样例输出 1
0
样例输入 2
5
1 9
1 10
2 11
2 12
2 13
样例输出 2
2
数据范围
对于 30% 的数据,n ≤ 10。
对于 60% 的数据,n ≤ 105,1 ≤ a ≤ 105,1 ≤ b ≤ n。
对于 100% 的数据,n ≤ 105,1 ≤ ai, bi ≤ 109
 
当时在考场上只想到了暴力搜索。。。不过仔细一考虑,这题其实挺简单的。
数据量比较大,需要我们进行离散化,去除相同的牌。一个显然的贪心就是找到花色出现次数最多的花色,则其他的花色的牌一定要换掉。
做到这里,应该能拿60.
100分做法:我们枚举在已有的同花顺序列上的最后一张牌,去寻找可能的第一张牌。我们令last为当前牌作为同花顺序列的最后一张牌时,可能的第一张牌。如果当前牌的点数是a,last牌的点数是b,则必须要满足a-b+1≤n。
GTY哥哥的std:
 #include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std; const int max_n = 1e5 + ; struct card {
int color, value;
bool operator < (const card &o) const {
return color < o.color || (color == o.color && value < o.value);
}
bool operator == (const card &o) const {
return color == o.color && value == o.value;
}
} a[max_n];
int n; int main() {
freopen("card.in", "r", stdin);
freopen("card.out", "w", stdout);
cin >> n;
for (int i = ; i <= n; i++) {
cin >> a[i].color >> a[i].value;
} sort(a + , a + + n);
int ori_n = n;
n = unique(a + , a + + n) - (a + ); int last_one = ;
int max_ans = ;
for (int i = ; i <= n; i++) {
if (i == || a[i].color != a[i - ].color)
last_one = i;
while (a[i].value - a[last_one].value + > ori_n)
last_one++;
max_ans = max(max_ans, i - last_one + );
} cout << ori_n - max_ans << endl;
}
 
T3:等式
题目描述
我有 n 个式子
对于每一个式子,要么是 x = x 的形式,要么是 x ≠ x 的形式。
现在我给出这 n 个式子,你要告诉我,这 n 个式子是否可能同时成立。
输入格式
每一个测试点有多组测试数据。
第一行有一个整数 T,表示测试数据的组数。
对于每一组测试数据,第一行包含一个正整数 n,表示式子的数目。
接下来 n 行,每行三个整数 i,j,e,描述一个式子。如果 e = 1,则这个式子为 x = x 。如果 e = 0,则这个式子是 x ≠ x 。
输出格式
对于每一个测试数据输出一行。如果存在一种方案,使得所有的式子都被满足,输出“YES”(不包含引号)。否则输出“NO”(不包含引号)。
样例输入 1
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
样例输出 1
NO
YES
6
样例输入 2
2
3
1 2 1
2 3 1
3 1 1
4
1 2 1
2 3 1
3 4 1
1 4 0
样例输出 2
YES
NO
数据范围
对于 20% 的数据,n ≤ 10。
对于 40% 的数据,n ≤ 100。
对于 70% 的数据,n ≤ 105,1 ≤ i, j ≤ 104
对于 100% 的数据,n ≤ 105,1 ≤ i, j ≤ 109 ,1 ≤ t ≤ 10。
 
这题其实就是NOI2015D1T1那个等价表达式。。
不过GTY哥哥为我们提供了一个算法,虽然只有70分但是听起来很有趣,读者不妨一试。
 
floodfill算法。将所有的等式关系建成一个图。然后我们循环每一个点,如果当前点还没有被访问过,则从这个点开始,dfs遍历所有和它有边相连的点,并标记。注意,标记是不一样的。从1开始遍历就标记为1,从2开始遍历就标记为2。然后我们检查所有的不等式。如果要求不等的两个点i和j标记相同,说明它们被要求“等于”,就输出NO。如果所有要求不等的两个点都不在一个联通块内,则输出YES。
 
正解应该是离散化+并查集,我在Day2内容整理里稍微说了一下。。
 
   GTY哥哥的std:
  

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std; const int max_n = 2e5 + ; struct data {
int x, y, e;
bool operator < (const data &o) const {
return e > o.e;
}
} a[max_n]; int fa[max_n];
int tmp[max_n], tot, n; int getfather(int x) {
if (fa[x] == x) return x;
return fa[x] = getfather(fa[x]);
} inline int getnum() {
int ans = ; char c; bool flag = false;
while (!isdigit(c = getchar()) && c != '-');
if (c == '-') flag = true; else ans = c - '';
while (isdigit(c = getchar())) ans = ans * + c - '';
return ans * (flag ? - : );
} int main() {
freopen("equ.in", "r", stdin);
freopen("equ.out", "w", stdout); int t = getnum();
while (t--) {
n = getnum();
tot = ;
for (int i = ; i <= n; i++) {
a[i].x = getnum();
a[i].y = getnum();
a[i].e = getnum();
tmp[++tot] = a[i].x;
tmp[++tot] = a[i].y;
} sort(a + , a + + n);
sort(tmp + , tmp + + tot);
tot = unique(tmp + , tmp + + tot) - (tmp + ); for (int i = ; i <= tot; i++) fa[i] = i; bool isok = true;
for (int i = ; i <= n; i++) {
a[i].x = lower_bound(tmp + , tmp + + tot, a[i].x) - tmp;
a[i].y = lower_bound(tmp + , tmp + + tot, a[i].y) - tmp;
if (a[i].e == ) fa[getfather(a[i].x)] = getfather(a[i].y);
else {
if (getfather(a[i].x) == getfather(a[i].y)) {
isok = false;
break;
}
}
} if (isok) cout << "YES" << endl;
else cout << "NO" << endl;
}
}

你问我为啥这些标程都不是我写的?

   源代码丢了……只能用一下天宇哥哥的std了。。。
 
 

夏令营提高班上午上机测试 Day 1 解题报告的更多相关文章

  1. 夏令营提高班上午上机测试 Day 2 解题报告

    那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧……   是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...

  2. 夏令营提高班上午上机测试 Day 3 解题报告

    今天的题的确水.T3还是一道NOIP原题. 嘛,多刷点水题也不是什么坏事嘛. 说来也快,夏令营结束了整一星期了呢.大家也都回到了日常的暑假生活呢. 今天学业水平测试出成绩了...嗯结果还算满意呢,至少 ...

  3. 夏令营提高班上午上机测试 Day 4 解题报告

    我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...

  4. nowcoder(牛客网)OI测试赛3 解题报告

    昨天因为胡搞了一会儿社团的事情,所以错过(逃过)了nowcoder的测试赛..... 以上,听说还是普及组难度qwq,而且还有很多大佬AK(然而我这么蒻肯定还是觉得有点难度的吧qwq) 不过我还是日常 ...

  5. 牛客OI赛制测试赛3 解题报告

    前话: 话说考试描述:普及难度. 于是想在这场比赛上涨点信心. 考出来的结果:Point:480     Rank:40 然而同机房的最好成绩是 510. 没考好啊!有点炸心态,D题一些细节没有注意, ...

  6. nowcoder(牛客网)提高组模拟赛第四场 解题报告

    T1 动态点分治 就是模拟..... 但是没有过!! 看了题解之后发现.... 坑点:有可能 \(x<=r\),但是

  7. nowcoder(牛客网)OI测试赛2 解题报告

    qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...

  8. nowcoder 提高组模拟赛 最长路 解题报告

    最长路 链接: https://www.nowcoder.com/acm/contest/178/A 来源:牛客网 题目描述 有一张 \(n\) 个点 \(m\) 条边的有向图,每条边上都带有一个字符 ...

  9. [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)

    题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...

随机推荐

  1. 【JAVA】SWING_ 界面风格

    在java中,界面外观的管理是由UIManager类来管理的.不同的系统上安装的外观不一样 ,默认的是java的跨平台外观. 1.获取系统所有外观 import javax.swing.*; impo ...

  2. 在.Net中将RocketMQ跑起来_入门篇【2】

    上一篇讲了如何再控制台将RocketMQ跑起来,本篇讲解,在asp.net mvc种跑起来,含(发布.订阅). 本次将不挨个贴源码,直接展示目录,根据上一篇文章,进行相应的调整即可. 1.新建一个类库 ...

  3. mysql 恢复数据

    前提:保存了需要恢复数据库的文件 .frm 和 .ibd 文件 条件:InnoDB 类型的 恢复表结构1.新建一个数据库--新建一个表,表名和列数和需要恢复数据库相同2.停止mysql服务器 serv ...

  4. 人生苦短,我用Python 第一篇

    一.变量名 自定义变量名只能用 数字.字母.下划线组成. 使用变量前,需对其先赋值 注意:1.变量名不能以数字开头:      2.不能是关键字:例如:'and', 'as', 'assert', ' ...

  5. HDU 1242 Rescue(优先队列)

    题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description   Angel was caught by ...

  6. HDU 5914 Triangle(打表——斐波那契数的应用)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...

  7. MLlib--保序回归

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/24cb3f38b55e5d7516d8059f9f105eb6.html 保序回归 1.线性回归VS保序回归 ...

  8. Anaconda更新和第三方包更新

    更新Anaconda和它所包含的包 1.打开cmd,切换到Anaconda的Scripts目录下:./Anaconda3/Scripts 2.更新Anaconda conda update conda ...

  9. JAVA 键盘输入数组,输出数组内容和最大值、最小值

    package shuzu; import java.util.Scanner; import java.util.Arrays; public class shuzu { /** * @param ...

  10. 关于Spring的69个面试题

    这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的.下次你再也不用担心你的面试了,Java Code Geeks这就帮你解答. 大多数你可能被问到的问题都 ...