博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017程序设计练习题之暴力专题2
阅读量:4946 次
发布时间:2019-06-11

本文共 5671 字,大约阅读时间需要 18 分钟。

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
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<
<<" "<
<
< cnt;i++)printf(" %d",c[i]); printf("\n"); } return 0;}

B题

//其实这题关键是从字符串中提取a,b,c可以用c语言的sscanf(),我这里是自己模拟写的。然后这里用eof结尾windows下cltr+z结束。#include
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\n",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\n",i,li[i],disli[i]);    }    int a,b;    while(~scanf("%d%d",&a,&b)&&a+b){        printf("%d %d\n",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
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\n",Max); } return 0;}

E题

//这题我是把所有的字符串全部输入进来后,每条处理。没处理一个字符cnt++,cnt%16==0就cnt_row++不过要注意回车算字符。#include
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] = '\n'; if(cnt1%16==0&&cnt1!=0)printf("\n"); 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
#include
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]

G题

//这题...不就是...如果字符串下标为3,4,5,6时输入"*"否则输入s[i]完美#include
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("\n"); } return 0;}

H题

//计算X,T,U三个字符中出现次数最少的。#include
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]

I题

//暴力i找能不能a2+i2=b2或者a2+b2=i2#include
#include
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\n",num); } else printf("None\n"); } return 0;}

转载于:https://www.cnblogs.com/wlxtuacm/p/6973961.html

你可能感兴趣的文章