目录
注:题目来自互联网,代码自己写的一些数据测试通过,但没有oj来评测,不敢保证完全正确,可以给大家一个解题思路。另外如有错误,欢迎评论指出,谢谢大家。
ps:这年的题是真的easy。
A.三元组
题目描述
给你一个长度为m的数组(数组元素从0到m-1),如果数组里有a[i]+a[j]==a[k](i,j,k大于等于0并且小于m),便称之为三元组。现在给你一个数组,让你求三元组的个数。
例如m为2,里面的元素为(0,0)
那么三元组为
(a[0],a[0],a[0])
(a[0],a[0],a[1])
(a[0],a[1],a[0])
(a[0],a[1],a[1])
(a[1],a[0],a[0])
(a[1],a[0],a[1])
(a[1],a[1],a[0])
(a[1],a[1],a[1])
输出答案为8.
输入
输入正整数N,表示N例测试。接着输入N组数据,每组输入m(1<=m<=50),表示数组长度,然后输入这个数组。
输出
对每组输入数据,输出三元组的个数。
输入示例:
2
2
0 0
5
1 1 1 2 1
输出:
8
16
思路
满足条件使用暴力dfs即可,很简单
代码
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=100;
int a[MAXV];
int m;
int result=0;
void dfs(int count,int n){
if(n==2){
for(int i=0;i<m;i++){
if(count==a[i]){
result++;
}
}
return;
}
for(int i=0;i<m;i++){
dfs(count+a[i],n+1);
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",a+i);
}
result=0;
dfs(0,0);
printf("%d\n",result);
}
return 0;
}
B.寻找变化前01序列
题目描述
给你一个01序列,HDLC协议处理的话,如果出现连续的5个1会补1个0。例如1111110,会变成11111010。
现在给你一个经过HDLC处理后的01序列,你需要找到HDLC处理之前的01序列。
例如给你11111010
你需要输出1111110
输入
输入正整数N,表示N例测试。接着输入N组数据,每组输入经过HDLC处理过的01序列(长度小于100)。
输出
对每组输入数据,输出HDLC处理前的01序列。
输入示例:
2
11111010
1111100
输出:
1111110
111110
思路
满足5个1后面是个0就把那个0删掉。
代码
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
void recString(string &s){
int count=0;
for(int i=0;i<s.length();i++){
if(s[i]=='1'){
count++;
}else{
if(count==5){
s.erase(s.begin()+i);
}
count=0;
}
}
}
int main(){
int T;
scanf("%d",&T);
char buf[110];
while(T--){
scanf("%s",buf);
string s(buf);
recString(s);
printf("%s\n",s.c_str());
}
return 0;
}
C.寻找i*j=m的个数
题目描述
3*3的矩阵内容。
1 2 3
2 4 6
3 6 9
即a[i][j](1<=i<=n,1<=j<=n)=i*j。
问一个这样n*n的矩阵里面,里面m出现的次数。
例如n为3,m为6.
那么出现的次数就是2
输入
输入正整数N,表示N例测试(N<=20)。接着输入n(n<=10^5),m(<=10^9)。
输出
对每组输入数据,输出m出现的次数。
输入示例:
2
3 6
3 3
输出:
2
2
思路
这个题说的挺复杂,其实就是求小于n的约数个数,可以参考我以前的博客约束个数。
代码
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int n,m;
int calMax(int x){
int result=0;
int i=1;
for(i=1;i*i<x;i++){
if(x%i==0 && i<=n && x/i<=n){
result+=2;
}
}
if(i*i==x) result++;
return result;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
printf("%d\n",calMax(m));
}
return 0;
}
D.字符串处理
题目描述
有以下三种操作。
(1)COPY l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列复制到剪贴板t里面,覆盖t字符串。
例如s为abcde t为pqr
执行COPY 1 2变为
s为abcde t为bc
(2)CUT l r(0<=l<=r<n),n代表s串的长度。这个表示将s串从l到r的序列剪切到剪贴板t里面(删除s串中的l到r的序列),覆盖t字符串。
例如s为abcde t为pqr
执行CUT 1 2变为
s为ade t为bc
(3)PASTE p(0<=p<n),n代表s串的长度。这个表示将t串插入到s串p位置的后面。t保持不变。
例如s为abcde t为pqr
执行PASTE 1 变为
s为abpqrcde t为pqr
输入
输入正整数N,表示N例测试。首先给你s串,再给你一个m,然后给你m个操作。
输出
对每个操作,输出操作后的s串。
输入示例:
2
abcde
5
CUT 1 2
COPY 0 1
PASTE 1
PASTE 1
CUT 1 3
abc
3
CUT 0 1
COPY 0 0
PASTE 0
输出:
ade
ade
adade
adadade
aade
c
c
cc
思路
就是一个字符串处理,不知道这个题为啥会出压轴的位置额,是我太菜忽略了细节吗,感觉简单的可怕啊。
代码
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
scanf("%d",&N);
while(N--){
char buf[1000];
scanf("%s",buf);
string s(buf);
string t;
int m;
scanf("%d",&m);
while(m--){
char buf2[50];
scanf("%s",buf2);
string ord(buf2);
if(ord=="COPY"){
int l,r;
scanf("%d%d",&l,&r);
t=s.substr(l,r-l+1);
// cout<<"t="<<t<<endl;
printf("%s\n",s.c_str());
}else if(ord=="CUT"){
int l,r;
scanf("%d%d",&l,&r);
t=s.substr(l,r-l+1);
// cout<<"t="<<t<<endl;
s.erase(s.begin()+l,s.begin()+r+1);
printf("%s\n",s.c_str());
}else if(ord=="PASTE"){
int p;
scanf("%d",&p);
s.insert(p+1,t);
printf("%s\n",s.c_str());
}
}
}
}