一、Vjudge
1.Connection and Disconnection
题意:
Given is a string S. Let T be the concatenation of K copies of S. We can repeatedly perform the following operation: choose a character in T and replace it with a different character. Find the minimum number of operations required to satisfy the following condition: any two adjacent characters in T are different.
输入:
Input is given from Standard Input in the following format:
S
K
- 1≤|S|≤100
- S consists of lowercase English letters.
- 1≤K≤10^9
- K is an integer.
输出:
Print the minimum number of operations required.
样例输入:
issii
2
样例输出:
4
T is issiiissii. For example, we can rewrite it into ispiqisyhi, and now any two adjacent characters are different.
解题思路:
就是给你一段字符串,重复k次后求最少改几个字符,让它两边的字符与它不同,写的时候要注意所有字符一样和头尾字符一样的情况。
这道题真的是气死我了,到最后都没写出来,就差最后一个测试点,第二天又补了好几次,最后还是看题解写出来的,我到现在还是不知道我的写法哪里错了,气死了。
程序代码:(WA)
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1;
getline(cin,s1);
long long k;
cin>>k;
if(s1.length()==1){
cout<<k/2<<endl;
return 0;
}
int flag=1;
int len=s1.length();
for(int i=1;i<len;i++){
if(s1[i]!=s1[i-1]){
flag=0;
break;
}
}
if(flag){
cout<<len*k/2<<endl;
return 0;
}
//ababababa ababababa 5 4
//7 6
long long cnt=0;
for(int i=1;i<s1.length();i++){
if(s1[i]==s1[i-1])
cnt++,i++;
}
long long cnt1=0;
string s2=s1+s1;
for(int i=1;i<s2.length();i++){
if(s2[i]==s2[i-1])
cnt1++,i++;
}
// if(s1[0]==s1[s1.length()-1]){
// flag=1;
// }else{
// flag=0;
// }
// cout<<cnt<<" "<<cnt1<<endl;
// cout<<k/2<<endl;
if(cnt==(cnt1-cnt)){
cout<<cnt*k<<endl;
}
else{
// if(flag){
if(k%2==0)
cout<<cnt1*(k/2)+(cnt1-cnt)*(k/2-1)<<endl;
else
cout<<cnt+(cnt1-cnt)*(k-1)<<endl;
// }else{
// if(k%2==0)
// cout<<cnt1*(k/2)<<endl;
// else
// cout<<(cnt1-cnt)+cnt1*(k/2)<<endl;
// }
}
return 0;
}
程序代码:(AC)
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1;
getline(cin,s1);
long long k;
cin>>k;
if(s1.length()==1){
cout<<k/2<<endl;
return 0;
}
int flag=1;
int len=s1.length();
for(int i=1;i<len;i++){
if(s1[i]!=s1[i-1]){
flag=0;
break;
}
}
if(flag){
cout<<len*k/2<<endl;
return 0;
}
long long cnt=0;
for(int i=1;i<s1.length();i++){
if(s1[i]==s1[i-1])
cnt++,i++;
}
if(s1[0]==s1[s1.length()-1]){
flag=1;
}else{
flag=0;
}
if(flag){
int a=1,b=1;
for(int i=1;i<s1.length();i++){
if(s1[i]!=s1[i-1]) break;
a++;
}
for(int i=s1.length()-2;i>=0;i--){
if(s1[i]!=s1[i+1]) break;
b++;
}
cout<<cnt*k-((a/2+b/2)-(a+b)/2)*(k-1)<<endl;
}else{
cout<<cnt*k<<endl;
}
return 0;
}
二、PTA
1.求链式表的表长
题意:
本题要求实现一个函数,求链式表的表长。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode List;
List Read(); /* 细节在此不表 */
int Length( List L );
int main()
{
List L = Read();
printf("%d\n", Length(L));
return 0;
}
/* 你的代码将被嵌在这里 */
L是给定单链表,函数Length要返回链式表的长度。
样例输入:
1 3 4 5 2 -1
样例输出:
5
解题思路:
其实只用一个个找下去就行了,刚开始我想的很复杂,又设了一个指针,重点是还写错了!!最后百度的,才发现原来这么简单。
程序代码:
int Length(List L){
int cnt=0;
while(L!=NULL)
{
cnt++;
L=L->Next;
}
return cnt;
}
2.链式表操作集
题意:
本题要求实现链式表的操作集。
各个操作函数的定义:
-
Position Find( List L