第一次写题解和写博客,若有错误希望各位包容
(由于对知识点的了解不多,可能不知道有的题的知识点是啥)
输入一段文字,找出每一个单词的大写字母的个数,称为这个单词的量(?不知道该如何翻译),输出那个最大的单词的量。
思路: 把输入的文本看作一个个字符,如果这个字符是大写字母就计数加一,然后遇到空格计数清零同时和max比较,若比max大的话那就让max变成目前的计数。代码: #include <stdio.h> #include <iostream> #include <string> using namespace std; int main() { int n,i,max = 0,s = 0; cin >> n; char a[n + 1]; getchar(); for(i = 0 ; i < n; i++) { a[i] = getchar(); if(a[i] != ' ') { if(a[i] >= 65 && a[i] <= 90) { s++; } } else { if(s > max) max = s; s = 0; } } if(s > max) max = s; cout << max <<endl; return 0; }题意: 给定两个字符串,对于较短的字符串作尽可能小的字符更换,使得更换后的字符串是较长字符串的子链。要求输出那个替换的字母个数以及具体位置(是较短字符串的第几个)
思路 是暴力!这道题使用了暴力! 由于发现数据均是在1000以内之后,发现可以使用暴力来解决问题。 首先从两个字符串的头开始比较字符不同的个数,并且要随时记录位置,循环完一次短的字符串之后,又从较长的字符串第二个字符开始一个个与较短字符比较,依次重复,一共需要比较L - l + 1次(L为长字符串的长度,l为短字符串的长度)。最后同样在每次比较完后比较是否为最小,是的话将要进行记录和改变min值。
然后还是超时了,我就优化了一下比较min是否已经为0,是的话可以直接结束大循环,然后还有小循环中判断计数是否已经超过了min,是的化就直接进入下一次循环。
代码:
#include <stdio.h> #include <iostream> #include <string> using namespace std; int main() { int n,m,min2,min1 = 1000,i,j; cin >> n >> m; char a[n],b[m]; cin >> a >> b; int c[m-n+1][n]; for(i = 0;i <= m - n;i++) { int s = 0; int x = 0; for(j = 0; j < n;j++) { if(a[j] != b[j + i]) { c[i][s] = j + 1; s++; if(s > min1) { x = 1; break; } } } if( x == 1) continue; min1 = s; min2 = i; if(s == 0) break; } cout << min1 << endl; for(i = 0;i < min1;i++) cout << c[min2][i] << ' '; return 0; }题意: 有一个只有一根但是有分叉的树,先从根开,每一个节点开始向上涂颜色,然后输入每一个节点(包括顶点)的颜色,问最少需要涂多少次。
思路: 正好在上一周听了学长讲的查并集(虽然还是不太懂 ),所以很快有了些思路,发现最后只需要比较一个节点与他的父节点的颜色是否相同,不是的话涂颜色的次数加一就行了。
代码:
#include <stdio.h> #include <iostream> #include <string> using namespace std; int main() { int n,t = 1,i; cin >> n; int a[n + 1],b[n + 1]; a[1] = 1; for(i = 2;i <= n; i++) cin >> a[i]; for(i = 1;i <= n; i++) { cin >> b[i]; } int c[n] = {0}; for(i = 2;i <= n; i++) { if(b[a[i]] != b[i]) t++; } cout << t << endl; return 0; }F题还没看…之后补上。