HPU暑期集训积分赛1
A. Nth power of n
单点时限: 1.0 sec
内存限制: 512 MB
求 nn 的个位数。
输入格式
多组输入,处理到文件结束。
每组数据输入一个 n。(1≤n≤109)
输出格式
输出 nn 的个位数。
思路:
简单的快速幂。
B. 复读机的力量
单点时限: 2.0 sec
内存限制: 512 MB
Codancer: “我好菜啊!”
Dicer: “我好菜啊!”
Todest: “我好菜啊!”
CaprYang: “我好菜啊!”
…
大佬们又开始装弱了,真正的菜鸡瑟瑟发抖不敢说话。
我们规定一个人是复读机当且仅当他说的每一句话都是复读前一个人说的话。
我们规定一个人是复读机当且仅当他说的每一句话都是复读前一个人说的话。
我们规定一个人是复读机当且仅当他说的每一句话都是复读前一个人说的话。
规定一个复读机的熟练度为复读数量的多少。现在给你一段聊天记录,请你找出其中的复读机们。
规定一个复读机的熟练度为复读数量的多少。现在给你一段聊天记录,请你找出其中的复读机们。
规定一个复读机的熟练度为复读数量的多少。现在给你一段聊天记录,请你找出其中的复读机们。
输入格式
输入T组,(1≤T≤10)
每组第一行输入一个正整数N,表示聊天记录的长度(1≤N≤10000)。
接下来N行,每行两个字符串,前一个字符串为姓名,后一个字符为聊天记录。
保证所有字符串长度不超过50,保证所有字符串只包含小写字母.
输出格式
如果没有复读机,输出 “Unbelievable!”(不包含引号)
否则按照熟练度从大到小输出所有的复读机,如果熟练度相同,按照字典序从小到大输出。
样例
1
4
codancer iamsovegetable
dicer iamsovegetable
todest iamsovegetable
capryang iamsovegetable
capryang
dicer
todest
思路:
利用map字典的功能来增加熟练度,并将map数据存入数组进行排序输出。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<string,string> P;
const ll MAX=1e9+;
struct node{
string s;
int a; }arr1[+] ;
bool cmp(node x,node y){
if(x.a!=y.a)
return x.a>y.a;
return x.s<y.s;
}
int main(){
vector<P>arr;
P p;
ll a,b;
cin>>a;
string s1;
string s2;
while(a--){
cin>>b;
map<string,int>mp;
map<string,int>mp1;
for(int i=;i<b;i++){
cin>>s1>>s2;
p.first=s1;
p.second=s2;
arr.push_back(p);//将数据存进数组
}
mp1[arr[].first]=;//mp1是判断他是不是复读机是的话为1
for(int i=;i<b;i++){
if(!mp1[arr[i].first]){
if(arr[i].second==arr[i-].second){//判断这一句与前一句是否相同
mp[arr[i].first]++;//mp来存熟练度
} else{//如果不相同说明说这句画的人不是复读机
mp1[arr[i].first]=;
mp[arr[i].first]=;//令他的熟练度为0
}
}
}
int i=;
if(mp.size()){//存入map的个数
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
if(it->second){//复读机且熟练度不为0存入到一个数组
arr1[i].s=it->first;
arr1[i].a=it->second;
i++;//数组中个数
}
}
if(i==){
puts("Unbelievable!");
}
else{ sort(arr1,arr1+i,cmp);//排序
for(int j=;j<i;j++){
cout<<arr1[j].s<<endl;
}
}
}
else{
puts("Unbelievable!");
}
arr.clear();
} return ;
}
C. 无穷的小数
单点时限: 1.0 sec
内存限制: 512 MB
在十进制下,我们能够很轻易地判断一个小数的位数是有穷的或无穷的,但是把这个小数用二进制表示出的情况下其有穷性和无穷性就会发生改变,比如
十进制下的 0.5 ,在二进制下的值为 0.1 ;
十进制下的 0.75 ,在二进制下的值为 0.11 ;
十进制下的 0.6 ,在二进制下的值为 0.1001100......
给你一个十进制的小数,判断其在二进制表示下小数位数是否无穷。
输入格式
多组输入,处理到文件结束
每组数据输入一个六位的小数 n.(0≤n<1)
输出格式
如果在二进制下小数位数是有穷的,输出”YES”,否则输出”NO”.
样例
0.500000
0.600000
0.750000
YES
NO
YES
思路:
十进制小数转化为二进制小数时,可以采用乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分为零为止。
因为精度问题要将小数先化为整数,然后操作,当一个数循环到一定数目后小数部位仍然不为0,即可判断它为无限循环小数。
D. Special String
单点时限: 2.0 sec
内存限制: 512 MB
我们定义一个字符串S为Special String只要这个字符串满足下面这些条件:
1.这个串是回文的,即把这个字符串正着读和反着读相同,如abba和aca,而ba和abca则不是。
2.26个小写字母必须全部出现
3.这个串的长度为偶数。
对于给定的S,判断它是否是Special String.
输入格式
输入一个只由小写字母组成的字符串S。(1≤|S|≤105)
输出格式
如果这个字符串是Special String,输出”YE5”,否则输出”N0”
样例
aaaa
N0
abcdefghijklmnopqrstuvwxyzzyxwvutsrqponmlkjihgfedcba
YE5
思路:
根据要求逐一判断即可。注:尽量将输出内容复制粘贴到代码中,以免Wa和Pe.
E. Max Gcd
单点时限: 2.0 sec
内存限制: 512 MB
一个数组a,现在你需要删除某一项使得它们的gcd最大,求出这个最大值。
输入格式
第一行输入一个正整数n,表示数组的大小,接下来一行n个数,第i个数为ai。(2≤n≤105,1≤ai≤109)
输出格式
输出删除掉某个数以后的gcd的最大值。
样例
4
2 4 8 1
2
4
1 2 3 4
1
提示
样例一:删除第四个元素后,2,4,8的最大公因子为2。
样例二:无论删除哪一个,最大公因子都为1。
思路:
多个数求最大公约数时,前n-1个数的公约数与第n个数一起求得的公约数即为前n个数的最大公约数。
方法可用前缀后缀法,然后遍历数组,求减去某一个数后最大公约数。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int q[+];
int h[+];
int arr[+];
int main(){
int n,ans=;
cin>>n;
for(int i=;i<n;i++){
cin>>arr[i];
}
q[]=arr[];
h[n-]=arr[n-];
for(int i=;i<n;i++){
q[i]=__gcd(q[i-],arr[i]);
h[n-i-]=__gcd(h[n-i],arr[n-i-]);
}
ans=max(h[],q[n-]);
for(int i=;i<n-;i++){
ans=max(ans,__gcd(q[i-],h[i+]));
}
cout<<ans;
return ;
}
F. Count Prime Pairs
单点时限: 2.0 sec
内存限制: 512 MB
对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数。
输入格式
第一行输入一个n,表示数组的长度,接下来n个整数,第i个数代表ai。
(1≤n≤100000,0≤ai≤100)
输出格式
输出数组中质数对的个数。
样例
3
1 2 3
4
提示
样例说明:a1+a2,a2+a1,a2+a3,a3+a2都为质数,总共有四对。
思路:
解题关键在于要知道将同一元素合并,然后判断任两元素之和是否为素数。提醒自己:越到最后,越不能乱,静下心来,认真思考。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int arr[];
int arr1[+];
int arr2[+];
map<int,int>mp;
void su(){
for(int i=;i<;i++){
if(!arr[i]){
for(int j=i*;j<;j+=i){
arr[j]=;
}
}
}
}
int main(){
arr[]=;
arr[]=;
su();
int a,b,sum=,k=,j=;
cin>>a;
for(int i=;i<a;i++){
scanf("%d",&b);
mp[b]++;
}
map<int,int>::iterator it1;
map<int,int>::iterator it2;
for(it1=mp.begin();it1!=mp.end();it1++){
for(it2=mp.begin();it2!=mp.end();it2++){
if(!arr[it1->first+it2->first]){
if(it1==it2)
sum+=(it1->second*(it2->second-));
else
sum+=(it1->second*it2->second);
}
}
}
printf("%d\n",sum);
return ;
}
G. 平行线
单点时限: 2.0 sec
内存限制: 512 MB
“大猩猩为什么不喜欢平行线?”“因为平行线没有相交”
哈哈哈哈哈哈哈哈哈
为了管理动物园不听话的大猩猩们,动物管理员Boctorio 决定去远方的ACM之城找一些平行线,当他逛到一个神奇的店铺时,他发现了一副黑色的图,上面依稀可见一些白色的点。Boctorio 询问店铺老板这幅画是什么,老板说:“天机不可泄露”。等Boctorio仔细端详了一会这幅画后,他惊讶的发现其中所蕴含的奥秘。向店铺老板道谢后,他拿着刚买的这幅画,就连忙赶回动物园。
输入格式
输入一个数 n(1≤n≤1000),表示点的个数。
接下来n行,每行两个整数 xi,yi(1≤xi,yi≤109),表示第i个点。
数据保证没有重复的点
输出格式
输出用这些点所能表示出来的平行线段的对数。(两条不同的线段重合也算为平行)
样例
6
0 0
1 0
1 1
3 1
3 3
5 4
10
思路:
使用求斜率的方法。也可用向量,下面是学长简短明了的代码。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = ;
typedef long long ll;
int x[N],y[N];
int main(){
int n;
cin>>n;
map<pair<int,int> ,int> k;
set<pair<long long,long long> > all;
long long ans=;
for(int i=;i<=n;i++) cin>>x[i]>>y[i];
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
int dx=x[j]-x[i];
int dy=y[j]-y[i];
if(dx<&&dy<){
dx=-dx;
dy=-dy;
}
long long gc=__gcd(dx,dy);
dx/=gc;dy/=gc;
k[{dx,dy}]++;
all.insert({dx,dy});
}
}
for(auto v:all){
ans+=(k[v]*(k[v]-)/);
}
cout<<ans<<endl;
return ;
}
H. Area of polygons
单点时限: 2.0 sec
内存限制: 512 MB
现在有a个边长为1的正方形,b个半径为1的圆,c个边长为1的等边三角形,现在你随机拿出一个图形,求这个图形面积的期望。
输入格式
第一行输入一个T,代表输入的组数。(1≤T≤100)
接下来T行,每行三个数字a,b,c(1≤a,b,c≤1000)。
输出格式
输出T行,对于每一组输入,输出面积的期望,小数点后保留三位小数。
样例
3
1 2 3
4 5 6
7 8 9
1.430
1.487
1.501
提示
圆周率为3.1415926535897
思路:
数学要学好。
I. 双色球
单点时限: 2.0 sec
内存限制: 512 MB
双色球投注区分为红色球号码区和蓝色球号码区,红色球号码区由1-33共三十三个号码组成,蓝色球号码区由1-16共十六个号码组成。投注时选择6个红色球号码和1个蓝色球号码组成一注进行单式投注。其中奖规则为:
一等奖(6+1)
二等奖(6+0)
三等奖(5+1)
四等奖(5+0、4+1)
五等奖(4+0、3+1)
六等奖(2+1、1+1、0+1)
其中(a+b)即为有a个红色球,b个蓝色球与开奖某个数字相同(只与数字有关,与位置无关)。
现在你有 n 张双色球彩票,以及本场彩票开奖结果,请你求出这 n 张彩票获得的最高奖。
输入格式
第一行输入一个 n ,表示 n 张彩票
接下来 n 行,每行 7 个数字,表示每张彩票的选号,其中前六个位红色球,后一个为蓝色球。
接下来一行,输入 7 个数字,表示开奖结果,其中前六个为红色球,后一个为蓝色球。
输出格式
输出所有彩票中能获得的最高等级奖,若无,则输出”0”。
样例
5
2 17 21 28 30 32 10
2 12 17 29 30 31 15
9 10 19 25 26 30 12
6 8 18 29 30 31 10
13 14 21 22 27 32 8
6 7 12 19 27 28 12
6
3
2 17 21 28 30 32 10
2 12 17 29 30 31 15
9 10 19 25 26 30 12
6 8 18 29 30 31 10
6
提示
彩票六个红色球数字均为从小到大排列
思路:
直接比较即可,不知道自己代码错哪,意外ac。
学长代码如下:
#include<bits/stdc++.h> using namespace std;
pair<int,int> solve(vector<int> a,vector<int> b){
int num[];
memset(num,,sizeof(num));
int r=;
int bl=;
for(int i=;i<;i++){
num[a[i]]++;
}
for(int i=;i<;i++){
if(num[b[i]]) r++;
}
if(a[]==b[]) bl=;
return {r,bl};
}
int cal(pair<int,int> pii){
if(pii.first==&&pii.second==) return ;
if(pii.first==&&pii.second==) return ;
if(pii.first==&&pii.second==) return ;
if((pii.first==&&pii.second==)||(pii.first==&&pii.second==)) return ;
if((pii.first==&&pii.second==)||(pii.first==&&pii.second==)) return ;
if((pii.first==&&pii.second==)||(pii.first==&&pii.second==)||(pii.first==&&pii.second==)) return ;
return ;
}
const int N = 1e3+;
vector<int> a[N];
int main(){
int n;
cin>>n;
for(int i=;i<=n;i++){
int x;
for(int j=;j<;j++){
cin>>x;
a[i].push_back(x);
}
}
int ans=;
vector<int> b();
for(int i=;i<;i++) cin>>b[i];
for(int i=;i<=n;i++) {
ans=min(ans,cal(solve(a[i],b)));
}
if(ans==) ans=;
cout<<ans<<endl;
return ;
}
J. Remainder Minimization 2019
单点时限: 1.0 sec
内存限制: 512 MB
给你一个区间[L,R],在这个区间内找到两个不同的数字i,j,使得(i∗j)%2019的值最小。
输入格式
输入两个数 L,R,(1≤L<R≤109)
输出格式
如题
样例
4 5
20
2020 2040
2
思路:
脑子短路。在他区间内有任何2019的倍数即为0。
#include<bits/stdc++.h> using namespace std;
int main(){
long long L,R;
cin>>L>>R;
if(R-L>) cout<<<<endl;
else{
int ans=;
for(int i=L;i<=R;i++){
for(int j=i+;j<=R;j++){
ans=min(ans,((i%)*(j%))%);
}
}
cout<<ans<<endl;
}
return ;
}
加油,努力,像大佬学习。
HPU暑期集训积分赛1的更多相关文章
- HPU暑期集训积分赛2
A. 再战斐波那契 单点时限: 1.0 sec 内存限制: 512 MB 小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z ...
- 河南理工大学算法协会暑期集训积分赛(二)网络同步赛-Numbers of interval-尺取法
原题链接:https://hpuoj.com/contest/24/problem/E/ 思路:一般的尺取法,不断更新左端点的值. #include<iostream> #include& ...
- 2014年CCNU-ACM暑期集训总结
2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...
- 8.10 正睿暑期集训营 Day7
目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...
- 8.6 正睿暑期集训营 Day3
目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...
- 8.9 正睿暑期集训营 Day6
目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...
- 8.8 正睿暑期集训营 Day5
目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...
- 8.7 正睿暑期集训营 Day4
目录 2018.8.7 正睿暑期集训营 Day4 A 世界杯(贪心) B 数组(线段树) C 淘汰赛 考试代码 A B C 2018.8.7 正睿暑期集训营 Day4 时间:5h(实际) 期望得分:. ...
- 8.5 正睿暑期集训营 Day2
目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...
随机推荐
- 「中高级前端必须了解的」JS中的内存管理
前言 像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()用于分配内存和释放内存. 而对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不 ...
- 中转Webshell 绕过安全狗(一)
前言 听说中国菜刀里有后门.抓包我是没有监测到异常数据包.为了以防万一,且更好使用中国菜刀硬杠安全狗.笔者收集了一下资料.无耻的copy大佬的源码,只是在大佬的基础上简单修改了一下,达到Webshel ...
- 微信小程序ES6方法Promise封装接口
为何要封装接口? 有小程序开发的经验者,相信对微信API Request很熟悉了.对接接口时,有大部分的开发者都是直接调用request方法,去请求后台接口并渲染数据.诚然,直接使用api发起请求对接 ...
- centos6.5虚拟机配置Nat模式连接外网
想来在虚拟机上搭点软件,于是乎就想让虚拟机连上外网,就用到了Nat模式,自己对网络了解不是太深,以至于配置联网花了一下午.总结下联网步骤. (1)点击虚拟网络编辑器 (2)注意以下几点标红处 (3)点 ...
- Failed to start Docker Application Container Engine.
[root@dockertest ~]# systemctl status docker.service● docker.service - Docker Application Container ...
- TCP/IP网络协议
OSI七层模型 OSI采用了分层的结构化技术,共分七层,物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP模型 OSI模型比较复杂且学术化,所以我们实际使用的TCP/IP模型, ...
- ZOJ 3795:Grouping(缩点+最长路)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5303 题意:有n个人m条边,每条边有一个u,v,代表u的年龄大于等于v,现在要 ...
- ECharts 地图绘制与钻取简易接口
1.地图绘制过程原理 给定范围边界经纬度数据,再给它个名字就构成了绘制地图的基础.也就是说,你可以绘制任意形状的地图版块. 2.地图数据生成 中国以及省市县等地图的基础数据可以从这里生成与下载. ht ...
- 【深入浅出-JVM】(34):CMS 回收器
概念 Concurrent Mark Sweep 并发标记清除(多线程并且用的标记清除算法),会造成大量的内存碎片,离散的可用空间无法分配较大的对象 流程 参数 -XX:-CMSPrecleaning ...
- Linux命令学习-wget命令
Linux系统中的wget是一个下载文件的工具,它用在命令行下,通过它可以方便的下载文件. 我们以百度的logo图片链接地址为例:https://www.baidu.com/img/bd_logo.p ...