勾股数 题目0001
题目描述:
如果三个正整数A、B、C ,A²+B²=C²则为勾股数
如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数,
则称其为勾股数元组。
请求出给定n~m范围内所有的勾股数元组
输入描述
起始范围
1 < n < 10000
n < m < 10000
输出描述
ABC保证A<B<C
输出格式A B C
多组勾股数元组,按照A B C升序的排序方式输出。
若给定范围内,找不到勾股数元组时,输出Na
。
示例一
-
输入
1 20
-
输出
3 4 5 5 12 13 8 15 17
示例二
-
输入
5 10
-
输出
Na
源码
//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool prime(const int &x,const int &y){
if(x==1||y==1){
return false;
}
int mmin=min(x,y);
for(int i=2;i<=mmin;i++){
if(x%i==0&&y%i==0){
return false;
}
}
return true;
}
int main(){
int n,m;
cin>>n>>m;
vector<int>temp;//记录临时元素
vector<vector<int>>res;//记录最终结果
bool flag= true;
//三个元素互质--必定不能够相等
for(int a=n;a<m;a++){
for(int b=a+1;b<m;b++){
for(int c=b+1;c<m;c++){
if(prime(a,b)&& prime(c,b)&& prime(a,c)){
if(a*a+b*b==c*c){
temp={a,b,c};
flag= false;
res.push_back(temp);
temp.clear();
}
}
}
}
}
if(!flag){
for(int i=0;i<res.size();i++){
for(int j=0;j<res[i].size();j++){
cout<<res[i][j]<<" ";
}
cout<<endl;
}
}else{
cout<<"Na"<<endl;
}
return 0;
}
两个数组前K对-合最小题目0002
题目描述:
给定两个整数数组,arr1、arr2,数组元素按升序排列;
假设从arr1、arr2中分别取出一个元素,可构成一对元素;
现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值;
注意:两对元素对应arr1、arr2的下标是相同的,视为同一对元素。
输入描述
输入两行数组arr1、arr2
每行首个数字为数组大小size, 0 < size <= 100
arr1,arr2中的每个元素e, 0< e <1000
接下来一行,正整数k 0 < k <= arr1.size * arr2.size
输出描述
满足要求的最小值
示例一
-
输入
1 1 2 1 2 3 2
-
输出
4
-
说明:
用例中需要取两个元素,取第一个数组第0个元素与第二个数组第0个元素组成一个元素[1,1];
取第一个数组第1个元素与第二个数组第0个元素组成一个元素[1,1];
求和为1+1+1+1=4 ,满足要求最小
源码
//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
class Solution{
public:
void Cin(vector<int>&arr1,vector<int>&arr2,int &k){
string s1;
getline(cin,s1);
/*第一步:接收字符串 s ;
第二步:遍历字符串 s ,把 s 中的逗号换成空格;
第三步:通过 istringstream 类重新读取字符串 s ;*/
istringstream ss(s1);
int temp;
while(ss>>temp){
arr1.push_back(temp);
}
string s2;
getline(cin,s2);
istringstream s(s2);
while(s>>temp){
arr2.push_back(temp);
}
cin>>k;
}
void getsum(vector<int>&arr1,vector<int>&arr2,int &k){
int length=arr1.size()*arr2.size();
vector<int>sum;
sum.reserve(length);
for(auto x:arr1){
for(auto y:arr2){
sum.push_back(x+y);
}
}
int res=0;
sort(sum.begin(),sum.end());
for(int i=0;i<k;i++){
res+=sum[i];
}
cout<<res;
}
};
int main(){
vector<int>arr1;
vector<int>arr2;
arr1.reserve(100);
arr2.reserve(100);
int k;
Solution l;
l.Cin(arr1,arr2,k);
l.getsum(arr1,arr2,k);
return 0;
}
TVL 解码– 题目0003
题目描述:
TLV编码是按TagLengthValue格式进行编码的,一段码流中的信元用tag标识,tag在码流中唯一不重复,length表示信元value的长度,value表示信元的值,码流以某信元的tag开头,tag固定占一个字节,length固定占两个字节,字节序为小端序,现给定tlv格式编码的码流以及需要解码的信元tag,请输出该信元的value。
输入码流的16进制字符中,不包括小写字母;
且要求输出的16进制字符串中也不要包含小写字母;
码流字符串的最大长度不超过50000个字节。
输入描述
第一行为第一个字符串 ,表示待解码信元的tag;
输入第二行为一个字符串, 表示待解码的16进制码流;
字节之间用空格分割。
输出描述
输出一个字符串,表示待解码信元以16进制表示的value。
示例一
-
输入
31 32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00
-
输出
32 33
-
说明
需要解析的信源的tag是31;
从码流的起始处开始匹配,tag为32的信元长度为1(01 00,小端序表示为1);
第二个信元的tag为90 其长度为2;
第三个信元的tag为30 其长度为3;
第四个信元的tag为31 其长度为2(02 00);
所以返回长度后面的两个字节即可 为 32 33。
源码
//
// Created by HANWENKE on 2022/8/27.
//
/*大端模式:高位字节存放在内存的低地址,低位字节存放在高地址
* 小端模式:低位字节存放在低地址,高位字节存放在高地址*/
#include <iostream>
#include <sstream>
#include <string.h>
#include <vector>
using namespace std;
int main(){
string s1;
getline(cin,s1);
string s2;
getline(cin,s2);
istringstream s(s2);
vector<string >res;
string temp;
while(s>>temp){
res.push_back(temp);
}
int n=0;
stringstream ss;
for(int i=0;i<res.size();){
string t=res[i+2]+res[i+1];
ss<<hex<<t;
ss>>n;
ss.clear();
if(s1==res[i]){
string rs;
for(int j=i+3;j<i+3+n;j++){
rs+=res[j];
rs+=" ";
}
cout<<rs<<endl;
break;
}else{
i+=n+3;
}
}
/* cout<<s1<<endl;
for(auto x:res){
cout<<x <<" ";
}*/
return 0;
}
猴子爬台阶 题目0004
题目描述:
一天一只顽猴想要从山脚爬到山顶
途中经过一个有n个台阶的阶梯,但是这个猴子有个习惯,每一次只跳1步或3步
试问?猴子通过这个阶梯有多少种不同的跳跃方式
输入描述
输入只有一个这个数n 0 < n < 50
此阶梯有多个台阶
输出描述
有多少种跳跃方式
示例一
-
输入
50
-
输出
122106097
示例二
-
输入
3
-
输出
2
源码
//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
using namespace std;
void solution(const int &n){
//第一个台阶一种方式,第2个台阶也只有一种方式,第3个台阶有两种方式
int dp[n];
dp[0]=0;
dp[1]=1;
dp[2]=1;
dp[3]=2;
if(n<=3){
cout<< dp[n];
return;
}
for(int i=4;i<=n;i++){
dp[i]=dp[i-1]+dp[i-3];
}
cout<<dp[n];
}
int main(){
int n;
cin>>n;
solution(n);
return 0;
}
GPU算力题目0005
为了充分发挥Gpu算力,
需要尽可能多的将任务交给GPU执行,
现在有一个任务数组,
数组元素表示在这1s内新增的任务个数,
且每秒都有新增任务,
假设GPU最多一次执行n个任务,
一次执行耗时1s,
在保证Gpu不空闲的情况下,最少需要多长时间执行完成。
输入描述
第一个参数为gpu最多执行的任务个数
取值范围1~10000
第二个参数为任务数组的长度
取值范围1~10000
第三个参数为任务数组
数字范围1~10000
输出描述
执行完所有任务需要多少秒
示例一
-
输入
3 5 1 2 3 4 5
-
输出
6
-
说明
一次最多执行3个任务,最少耗时6s
示例二
-
输入
4 5 5 4 1 1 1
-
输出
5
-
说明
一次最多执行4个任务,最少耗时5s
源码
//
// Created by HANWENKE on 2022/8/27.
//
#include <iostream>
#include <vector>
using namespace std;
void solution(int &n,vector<int>&temp){
int time=0;
int remaining=0;//如果当前任务处理不完、剩下的时间
for(auto count:temp){
if(remaining+count>n){
remaining=remaining+count-n;
}else{
remaining=0;
}
time++;
}
time+=remaining/n;
if(remaining%n>0){
time++;
}
cout<<time<<endl;
}
int main(){
int n;//cup最多执行的个数
cin>>n;
//数组的长度--这一秒新增的任务个数
int length;
cin>>length;
vector<int>temp;
temp.reserve(n);
int x;
for(int i=0;i<length;i++){
cin>>x;
temp.push_back(x);
}
solution(n,temp);
return 0;
}