黑龙江农垦科技职业学院寒假多校联赛2(快乐ak场)
部分题解,顺序由易到难(个人认为)
J题(签到题)
题目:
比赛开始了清楚姐姐喊了一句:签到了签到了 选手们纷纷开始签到,现在给出n个数字代表选手们签到所用秒数 请给出第几个选手最先签到。同秒数先输入的算快。
输入描述:
第一行输入一个整数n
1<=n<=10000
第二行输入n个整数s
0<=s<=1000
输出描述:
一个数
思路:很简单的一个签到题 ,暴力就完事了 -.-
代码如下:
#include <iostream>
using namespace std;
int a[10000] ;
int main()
{
int n;
int min=1000,t=1;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (min > a[i])
{
min = a[i];
t = i;
}
}
cout << t ;
return 0;
}
C题 (gg查成绩)
题目:
这一天gg拿到了一份,超多的考试数据a 。
老师要求他按照询问数据告诉老师,第几个到第几个同学的分数和是多少 ?
gg最近入职字节跳动了,没有时间处理这种极其简单的问题,所以请你顺手秒一下。
输入描述:
第一行n m ( n个同学 m次询问)
1<=n<=10^6
1<=m<=10^4
第二行输入n个整数表示成绩
a1 a2 …an (0<= ai <=100) 1<=i<=n
以下m行为两个整数bi bj 表示第几个到第几个同学(从1开始)
1<=bi<=bj<=n
输出描述:
m行查询结果
思路:题目很简单,只需要求两个数区间内的和,
但直接暴力的话会超时,所以只需要利用前缀和求一下前 i 项和就可以了。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int b[1000002];
int s[1000002];
int i,n,m,x,y;
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
s[i]=s[i-1]+b[i];//求前 i 项和
}
while(m--)
{
long long sum=0;
scanf("%d%d",&x,&y);
sum=s[y]-s[x-1]; // 可快速算出x,y内数值总和
printf("%lld\n",sum);
}
return 0;
}
G题 (Alan%%%)
题目:
如果一句话中存在Alan,那么那句话中的%都算%了Alan。由于可能话中有空格,所以去掉空格后形成的Alan也算Alan。
输入描述:
第一行输入整数n表示聊天记录行数
1 <= n <= 1000
以下n行每行一个字符串s代表聊天记录
1 <= s .length <= 1000
输出描述:
输出%Alan次数
示例:
输入:
5
%alan%%
%Alan%%%
cdqwsq%% A l a n%%
%AC lan%%
%Alan%%%
输出 :12
思路:字符串中有空格的话会影响判断是否存在 Alan ,所以第一步先把字符串中的空格去掉, 然后再判断是否含有Alan ,如果含有Alan再去统计该字符串中 % 的数量 。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int x,sum=0;
scanf("%d\n",&x); //读入时记得吃掉末尾的回车
while(x--)
{
string a,b;
getline(cin,a); //用cin会过滤掉空格,导致字符串读不全
for(int i=0;i<a.size();i++)
if(a[i]!=' ') b+=a[i]; //将除空格以外的字符放到另一个字符串中
int c=b.find("Alan"); //利用函数 find 判断是否含有Alan
if(c!=-1) //如果没有会返回 -1
{
for(int i=0;i<b.size();i++)
{
if(b[i]=='%')
sum++; //统计 % 数量
}
}
else continue;
}
cout<<sum;
return 0;
}
F题 (happy的异或运算)
题目:
添加链接描述
给出一个整数n,请求出1-n之间选取两个数进行异或最大能得出多大?(两个数可以相同)
输入描述:
1 ≤ N ≤1018
输出描述:
无
示例1:
输入:10000
输出:16383
示例2:
输入:648
输出:1023
示例3
输入:324
输出:511
思路:这是一道思维题,要取得最大数,只要让 n 的
二进制数字每位都是 1 即可。
PS:(不知道异或的话可以去看一下这篇文章)
代码如下:
#include <iostream>
using namespace std;
long long a;
int main()
{
cin>>a;
long long n=1;
while(a)
{
a/=2;
n*=2;
}
cout<<n-1;
return 0;
}
H 题 (cg写项目)
题目:
这一天cg写了一个卡迪亚酒店客户端,客户端的数据是一张由用户名s,密码m,性别x,电话h组成的表,他想以用户的用户名为基准进行一下排序,短的在前,同样长度按照字典序小的在前,同用户名先输入的在前面。但是曹哥太忙了所以找你帮忙写一下数据处理
输入描述:
n分数据
1<=n<=100
以下n行 为 s m x h
1<= s.length <=20
1<= m.length <=20
1<= x.length <=20
1<= h.length <=20
输出描述:
根据用户名排序规则排序后输出
示例:
链接:https://ac.nowcoder.com/acm/contest/11471/H
来源:牛客网
示例1
输入:
5
td1336065617 1336065617 n 3766949653
1336065617 1336065617 nc 137
ad1336065617 1336065617 na 111
03360651778 1 9 8
1 1 1 1
输出:
1 1 1 1
1336065617 1336065617 nc 137
03360651778 1 9 8
ad1336065617 1336065617 na 111
td1336065617 1336065617 n 13766949653
思路:
用结构体存放每个客户的数据,再根据每个客户的用户名排序,之后输出即可
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct kda
{
string s,m,x,h;
int id;
} arr[105];
bool cmp(kda a , kda b)
{
if(a.s.size()!=b.s.size()) return a.s.size()<b.s.size(); //长度短的在前
if (a.s!=b.s) return a.s <b.s; // 字符字典序小的在前
return a.id<b.id ; //先输入的在前
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) arr[i].id=i,cin>>arr[i].s>>arr[i].m>>arr[i].x>>arr[i].h;
sort(arr,arr+n,cmp); //利用 sort 函数排序方便又快捷 -.-
for(int i=0;i<n;i++) cout<<arr[i].s<<" "<<arr[i].m<<" "<<arr[i].x<<" "<<arr[i].h<<endl;
return 0;
}
I 题 (cg写项目加强版)
其实我感觉这题应该是最简单的,当然是你写出来第 H 题的前提下=.=
题目示例啥的我就不赘述了,只是扩大了n的范围;
(如果你非要看的话,链接在这里 =。=)
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct kda
{
string s,m,x,h;
int id;
} arr[1000005]; //增大了客户人数
bool cmp(kda a , kda b)
{
if(a.s.size()!=b.s.size()) return a.s.size()<b.s.size(); //长度短的在前
if (a.s!=b.s) return a.s <b.s; // 字典序小的在前
return a.id<b.id ; //先输入的在前
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) arr[i].id=i,cin>>arr[i].s>>arr[i].m>>arr[i].x>>arr[i].h;
sort(arr,arr+n,cmp);
for(int i=0;i<n;i++) cout<<arr[i].s<<" "<<arr[i].m<<" "<<arr[i].x<<" "<<arr[i].h<<endl;
return 0;
}