2026/4/16 21:17:08
网站建设
项目流程
网站建设微信商城开发,视觉设计师多少钱一个月,node框架做网站,广告电商怎么赚钱题目背景小果有一个只有两个键的键盘。题目描述一天#xff0c;她打出了一个只有这两个字符的字符串。当这个字符串里含有 VK 这个字符串的时候#xff0c;小果就特别喜欢这个字符串。所以#xff0c;她想改变至多一个字符#xff08;或者不做任何改变#xff09;来最大化…题目背景小果有一个只有两个键的键盘。题目描述一天她打出了一个只有这两个字符的字符串。当这个字符串里含有VK这个字符串的时候小果就特别喜欢这个字符串。所以她想改变至多一个字符或者不做任何改变来最大化这个字符串内VK出现的次数。给出原来的字符串请计算她最多能使这个字符串内出现多少次VK只有当V和K正好相邻时我们认为出现了VK。输入格式第一行给出一个数字 n代表字符串的长度。第二行给出一个字符串 s。输出格式第一行输出一个整数代表所求答案。思考历程又没有好好看题目意思题目要求的是最多改变一个字符要求出现最多的vk一开始没有考虑直接写分可低了。下面的代码没有考虑左右字符的影响没有考虑边界情况所以肯定不对#includestdio.h int main() { int n; while(scanf(%d,n)!EOF){ while(getchar()!\n); char s[n1]; fgets(s,sizeof(s),stdin); int i; int count0; for(i0;in-1;i){ if(s[i]Vs[i1]K||s[i]Ks[i1]V){ count; } } printf(%d,count); } return 0; }正确答案#includestdio.h #includestring.h int main() { int n; char s[101];//千万注意不要写成int类型 while(scanf(%d,n)1n!0){ scanf(%s,s);//把字符串赋值给字符串数组 int i; int original_count0;//没改字符之前统计的vk数量 for(i0;in-1;i){ if(s[i]Vs[i1]K){ original_count; } } int max_delta0; for(i0;in;i){ char old_chars[i];//把所有的字符赋值给old_char用于记录当前位置原来的字符 char new_char(old_charV)?K:V;//改变字符如果是v就改成k如果是k就改成v。 int delta0;//计算变化量 if(i-10){//因为i0时没有s[i-1] int old1_is_vk(s[i-1]Vold_charK); int new1_is_vk(s[i-1]Vnew_charK); delta(new1_is_vk?1:0)-(old1_is_vk?1:0);//计算vk组合新增加的数量。 } if(i1n){//因为有i1不能超过n一开始的i0肯定不满足上述条件 int old2_is_vk(old_charVs[i1]K); int new2_is_vk(new_charVs[i1]K); delta(new2_is_vk?1:0)-(old2_is_vk?1:0); } if(deltamax_delta){//因为最后要找出改变字符后的最大组合量所以要和原来有比较 max_deltadelta; } } int resultoriginal_count(max_delta0?max_delta:0);max_delta表示的是改变字符后新增加的组合量 printf(%d\n,result); } return 0; }一.上述代码是模拟修改不是真的修改所以不满足条件的不用再修改回来因为修改一个字符影响的是和前一个字符配对和后一个字符配对所以只需要考虑这两部分即可。i-1,i)和(i,i1)这两部分。当考虑到这两部分之后就要考虑i-1必须要大于0i1必须要小于0.for(i0;in;i){char old_chars[i];char new_char(old_charV)?K:V;int delta0;if(i-10){int old1_is_vk(s[i-1]Vold_charK);int new1_is_vk(s[i-1]Vnew_charK);delta(new1_is_vk?1:0)-(old1_is_vk?1:0);}if(i1n){int old2_is_vk(old_charVs[i1]K);int new2_is_vk(new_charVs[i1]K);delta(new2_is_vk?1:0)-(old2_is_vk?1:0);}用示例来解析上述代码假设字符串是VVK第一次循环i0考虑修改第一个字符old_char s[0] V new_char K // V改为K // 计算改变影响 // 只有(i,i1)即(0,1)受影响 // 改变前V(old)和V(s[1]) → VV 不是VK // 改变后K(new)和V(s[1]) → KV 不是VK // delta 0-0 0 //上述部分只符合下面的if语句所以只有一部分delta第二次循环i1,考虑修改第二个字符old_char s[1] V new_char K // V改为K // 计算改变影响 // (i-1,i)即(0,1)改变前VV(0)改变后VK(1) → delta_part1 1 // (i,i1)即(1,2)改变前VK(1)改变后KK(0) → delta_part2 -1 // total_delta 1 (-1) 0 //当改变第二个字符的时候既符合上述if语句又符合下面的if语句所以有两部分delta原来是VV不符合上述判断vk所以old1_is_vk0,而修改第二个字符之后变成VK符合杉树判断所以第一部分delta是1同时下面的if同样计算最后得出总的delta第三次循环i2考虑修改第三个字符old_char s[2] K new_char V // K改为V // 计算改变影响 // 只有(i-1,i)即(1,2)受影响 // 改变前V(s[1])和K(old) → VK 是VK // 改变后V(s[1])和V(new) → VV 不是VK // delta 0-1 -1 //i2时只符合上述if语句所以只计算一次就