Problem A
1.三元组
问题描述:
给你一个长度为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.
Input
输入正整数N,表示N例测试。接着输入N组数据,每组输入m(1<=m<=50),表示数组长度,然后输入这个数组。
Output
对每组输入数据,输出三元组的个数。
Sample Input
2
2
0 0
5
1 1 1 2 1
Sample Output
8
16
#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
int main(){
int N;
scanf("%d",&N);
while(N--){
int m;
scanf("%d",&m);
int a[m];
int size=0;
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
for(int k=0;k<m;k++){
if(a[i]+a[j]==a[k]){
size++;
}
}
}
}
printf("%d\n",size);
}
return 0;
}
Problem B
2.寻找变化前01序列
问题描述
给你一个01序列,HDLC协议处理的话,如果出现连续的5个1会补1个0。例如1111110,会变成11111010。
现在给你一个经过HDLC处理后的01序列,你需要找到HDLC处理之前的01序列。
例如给你11111010
你需要输出1111110
Input
输入正整数N,表示N例测试。接着输入N组数据,每组输入经过HDLC处理过的01序列(长度小于100)。
Output
对每组输入数据,输出HDLC处理前的01序列。
Sample Input
2
11111010
1111100
Sample Output
1111110
111110
#include<bits/stdc++.h>
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
while(N--){
char str[120];
scanf("%s",&str);
int len=strlen(str);
char ans[100];
int size=0;
int flag=0;
for(int i=0;i<len;i++){
if(flag==5){
flag=0;
continue;
}
if(str[i]=='1'){
flag++;
ans[size++]=str[i];
}
if(str[i]=='0'){
flag=0;
ans[size++]=str[i];
}
}
ans[size]='\0';
printf("%s\n",ans);
}
}
Problem C
Sample Input
2
3 6
3 3
Sample Output
2
2
这个题感觉考的是数学问题,我的理解首先是因为矩阵式对称的,故直接求一半,对角线上的+1,其他位置+2;
其次,实际是找m的因子,能分解因子的所有情况求出来就好。
#include<bits/stdc++.h>
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
while(N--){
int n,m;
scanf("%d%d",&n,&m);
int max=sqrt(m);
int size=0;
for(int i=1;i<=max;i++){
int ans=m/i;
int flag=ans*i;
if(i>n||ans>n)
continue;
if(flag==m){
size+=2;
}
}
if(max*max==m)
size++;
printf("%d\n",size);
}
}
Problem D
Sample Input
abcde
5
CUT 1 2
COPY 0 1
PASTE 1
PASTE 1
CUT 1 3
Sample Output
ade
ade
adade
adadade
aade
这题废了很久,如果考试肯定没a过,我调试了很久都没解决这个问题,我的m一旦进入循环就会被重置为0,不知道那个地方有问题,哪个数组越界覆盖了。。。。头大的不行,最后还是没解决这个问题,但是显示的是没问题,有大佬如果发现问题在哪请留言,谢谢了
#include<bits/stdc++.h>
#include<stdio.h>
int copy(char str[30],char t[30],int l,int r){
int i;
for(i=l;i<=r;i++){
t[i-l]=str[i];
}
for(;i<30;i++)
t[i]='\0';
for(int i=0;str[i]!='\0';i++)
printf("%c",str[i]);
printf("\n");
}
int cut(char str[30],char t[30],int l,int r){
int i;
int len=strlen(str);
for(i=l;i<=r;i++){
t[i-l]=str[i];
}
t[i-l]='\0';
for(int i=l;i+r-l+1<30;i++)
str[i]=str[i+r-l+1];
for(int i=0;str[i]!='\0';i++)
printf("%c",str[i]);
printf("\n");
}
int paste(char str[30],char t[30],int p){
char ans[30];
int lt=strlen(t);
int ls=strlen(str);
int len=ls+lt;
for(int i=0;i<len;i++){
if(i<=p)
ans[i]=str[i];
else if(i>p&&i<p+lt+1){
ans[i]=t[i-p-1];
}
else{
ans[i]=str[i-lt];
}
}
for(int i=0;i<30;i++)
str[i]=ans[i];
for(int i=0;str[i]!='\0';i++)
printf("%c",str[i]);
printf("\n");
}
int main(){
int N;
scanf("%d",&N);
while(N){
char str[30];
char t[30];
int mn;
scanf("%s",str);
scanf("%d",&m);
while(m){
char mis[5];
int l,r;
scanf("%s",mis);
if(mis[0]=='C'){
scanf("%d%d",&l,&r);
if(mis[1]=='O'){
copy(str,t,l,r);
}
else{
cut(str,t,l,r);
}
}
else{
int p;
scanf("%d",&p);
paste(str,t,p);
}
m--;
}
N--;
}
return 0;
}