A题
//A题最朴素的想法是每个A中的元素都在B中去查找看能否查到,于是可能就有o(n^2)的复杂度对于100000的数据是不能过的,用二分查找就可以了。
我这里的思路的话是o(n+m)的复杂度,就是设两个记号i和j,刚开始时都为0,然后由于两者都是有序的,让跑的慢的去追快的。如果a[i] < a[j]i++,a[i] > a[j] j++;如果两者相等i++,j++;
//如果还是不是很理解就看下代码吧,形容能力有限抱歉。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int a[maxn];
int b[maxn];
int c[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int k,j,m,n;
scanf("%d%d",&m,&n);
for(int i = 0;i < m;i++)scanf("%d",&a[i]);
for(int i = 0;i < n;i++)scanf("%d",&b[i]);
int res = 0;
k = 0;
j = 0;
int cnt = 0;
while(k < m&&j < n){
if(a[k] < b[j]){
k++;
}else if(a[k]==b[j]){
c[cnt++] = a[k];
k++;
j++;
res++;
}else j++;
}
//cout<<k<<" "<<j<<endl;
printf("%d
",res);
printf("%d",c[0]);
for(int i = 1;i < cnt;i++)printf(" %d",c[i]);
printf("
");
}
return 0;
}
B题
//其实这题关键是从字符串中提取a,b,c可以用c语言的sscanf(),我这里是自己模拟写的。然后这里用eof结尾windows下cltr+z结束。
#include<bits/stdc++.h>
using namespace std;
char s[100];
int main(){
int cnt = 0;
while(gets(s)!=0){
int a[3]={0,0,0};
char c = 'a';
int len = strlen(s);
int cnt1 = 0;
if(s[len-1]=='=')continue;
for(int i = 0;i < len;i++){
if(s[i]=='='){
cnt1++;
continue;
}
if(s[i]=='+'||s[i]=='-'){
cnt1++;
c = s[i];
continue;
}
a[cnt1] *=10;
a[cnt1] +=(s[i]-'0');
}
if(c=='+'&&a[0]+a[1]==a[2])cnt++;
if(c=='-'&&a[0]-a[1]==a[2])cnt++;
}
printf("%d
",cnt);
return 0;
}
C题
//这题就是打表的思路,用like[i]表示到i这里有多少个喜欢的数,dislike[i]表示多少个不喜欢的数,然后结果计算时相减,大一时很多这种类型的题就不详解了。
sing namespace std;
const int maxn = 1000000+5;
int li[maxn];
int disli[maxn];
int dislike(int a){
while(a){
if(a%10==4||a%10==7)return 1;
a/=10;
}
return 0;
}
int like(int a){
if(dislike(a))return 0;
while(a){
if(a%10==3||a%10==6)return 1;
a/=10;
}
return 0;
}
int main(){
disli[0] = 0;
li[0] = 0;
for(int i = 1;i < maxn;i++){
li[i] = li[i-1] + like(i);
disli[i] = disli[i-1] + dislike(i);
//if(i<=100)printf("%d %d %d
",i,li[i],disli[i]);
}
int a,b;
while(~scanf("%d%d",&a,&b)&&a+b){
printf("%d %d
",li[b]-li[a-1],disli[b]-disli[a-1]);
}
return 0;
}
D题
//先计算前缀和,就是sum[i] = sum[i-1] + a[i];然后i到j的字段和就是sum[j] - sum[i-1],暴力所有的字段和求最大值。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+5;
int a[maxn];
int sum[maxn];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)&&n+m){
int Max = -1;
sum[0] = 0;
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
sum[i] = sum[i-1] + a[i];
}
for(int i = 1;i <= n-m+1;i++){
Max = max(Max,sum[i+m-1]-sum[i-1]);
}
printf("%d
",Max);
}
return 0;
}
E题
//这题我是把所有的字符串全部输入进来后,每条处理。没处理一个字符cnt++,cnt%16==0就cnt_row++不过要注意回车算字符。
#include<bits/stdc++.h>
using namespace std;
char str[100000][1000];
int main(){
int cnt = 0;
while(gets(str[cnt++])!=0);
cnt--;
int cnt1 = 0;
int cnt_row = 0;
for(int i = 0;i < cnt ;i++){
int len = strlen(str[i]);
for(int j = 0;j <= len;j++){
if(j==len)str[i][j] = '
';
if(cnt1%16==0&&cnt1!=0)printf("
");
if(cnt1%16==0)printf("%05X",cnt_row++);
cnt1++;
if(cnt1%16==1)printf(" %02X",str[i][j]);
else printf(" %02X",str[i][j]);
}
}
return 0;
}
F题
//刚开始以为是搜索,结果只有3个可以三重循环暴力搞..........
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int time;
scanf("%d",&time);
while(time--){
int ret[4][4];
int i,j,k;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
scanf("%d",&ret[i][j]);
}
}
int d[4][4][4];
int flag[6]={0,0,0,0,0,0};
int cost[6];
char route[6][6]={{"1 2 3"},{"1 3 2"},{"2 1 3"},{"2 3 1"},{"3 1 2"},{"3 2 1"}};
int min=100000000;
for(i=1;i<4;i++){
for(j=1;j<4;j++){
for(k=1;k<4;k++){
if(i!=j&&j!=k&&i!=k){
d[i][j][k]=ret[0][i]+ret[i][j]+ret[j][k]+ret[k][0];
if(d[i][j][k]<min)min=d[i][j][k];
}
}
}
}
printf("%d
",min);
for(i=1;i<4;i++){
for(j=1;j<4;j++){
for(k=1;k<4;k++){
if(i!=j&&j!=k&&i!=k&&d[i][j][k]==min){
printf("%d %d %d
",i,j,k);
}
}
}
}
}
return 0;
}
G题
//这题...不就是...如果字符串下标为3,4,5,6时输入"*"否则输入s[i]完美
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--){
char s[20];
scanf("%s",s);
for(int i = 0;i < 11;i++){
if(i>=3&&i<=6)printf("*");
else printf("%c",s[i]);
}
printf("
");
}
return 0;
}
H题
//计算X,T,U三个字符中出现次数最少的。
#include<stdio.h>
int main(){
int time;
char a[1010];
scanf("%d",&time);
while(time--){
scanf("%s",a);
int cnt[3]={0,0,0};
int i;
for(i=0;a[i];i++){
if(a[i]=='X') cnt[0]++;
else if(a[i]=='T') cnt[1]++;
else if(a[i]=='U') cnt[2]++;
}
int min=cnt[0];
if(cnt[1]<min) min=cnt[1];
if(cnt[2]<min) min=cnt[2];
printf("%d
",min);
}
return 0;
}
I题
//暴力i找能不能a2+i2=b2或者a2+b2=i2
#include<iostream>
#include<stdio.h>
using namespace std;
int main() {
int time;
scanf("%d",&time);
while(time--) {
int a,b,c;
scanf("%d %d",&a,&b);
int flag=0,num=0;
for(int i=3; i<=11000; i++) {
if((a*a+b*b==i*i)||(a*a+i*i==b*b)||(b*b+i*i==a*a)) {
flag=1;
num=i;
break;
}
}
if(flag) {
printf("%d
",num);
} else printf("None
");
}
return 0;
}