一篇题解 (南昌理工ACM训练营)

黑龙江农垦科技职业学院寒假多校联赛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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值