团体程序设计天梯赛-练习集

Acm铁牌选手成长记

  • L1-002 打印沙漏
  • L1-006 连续因子
  • L1-009 N个数求和
  • L1-011 A-B
  • L1-015 跟奥巴马一起画方块
  • L1-016 查验身份证
  • L1-017 到底有多二
  • L1-020 帅到没朋友
  • L1-025 正整数A+B
  • L1-027 出租
  • L1-028 判断素数
  • L1-033 出生年
  • L1-034 点赞
  • L1-035 情人节
  • L1-039 古风排版
  • L1-043 阅览室
  • L1-044 稳赢
  • L1-046 整除光棍
  • L1-048 矩阵A乘以B
  • L1-049 天梯赛座位分配
  • L1-050 倒数第N个字符串
  • L1-054 福到了
  • L1-058 6翻了
  • L1-059 敲笨钟
  • L2-001 紧急救援

L1-002 打印沙漏

这题主要是找到行数和给定n的关系
从题目给的案例里我们可以看出每个沙漏的第一行符号的数量其实就是沙漏的层数,这就很好办了 假设层数为5 每个沙漏所需要的符号数量公式为(5+3)*2+1
我们可以利用循环来找到层数

for(int i=3;;i+=2)//利用循环来找到沙漏最多能打几层 
	{
		sum+=i*2;
		if(sum<=n)
		{
			k=i;//获取行数 
			h=n-sum;
		} 
		else
		break;
	}

接下来就是打印空格和*的关系 随着层数x的增加 每层的符号数量-2,直到(x-1)/2层变为一个后 又开始增加数量+2
而空格和层数的关系为x-1(x<(x-1)/2)| x-x(x>(x-1)/2)

上代码

#include 
#include
#include
using namespace std;
int main()
{
	int n;
	char s;
	cin>>n>>s;
	int sum=1,h,k;
	if(n>=7)//如果n小于7 无法构成沙漏那就输出一个*并输出n-1 否则会通不过测试 
	{
		for(int i=3;;i+=2)//利用循环来找到沙漏最多能打几层 
			{
				sum+=i*2;
				if(sum<=n)
				{
					k=i;//获取行数 
					h=n-sum;
				} 
				else
				break;
			}
	int m=k;//m为每行符号颗数 
	for(int i=1;i<=k;i++)
	{
		if(i<=(k-1)/2+1){
			for(int j=1;j<i;j++)
			cout<<" ";
			for(int j=1;j<=m;j++)
			{
				cout<<s;
			}
			if(i<=(k-1)/2)
			m-=2;
			cout<<endl;
		}
		else
		{
			m+=2;
			for(int j=k;j>i;j--)
			cout<<" ";
			for(int j=1;j<=m;j++)
			{
				cout<<s;
			}
			cout<<endl;
		}
		
	}
	cout<<h;
	
	
}else
	{
		cout<<s<<endl<<n-1;
	}
	
}

一定要注意 如果n数量无法构成沙漏那要输出一个符号和n-1 如果刚好用完也要输出0 否则通不过案例测试

L1-006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:
输入在一行中给出一个正整数 N(1

输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:
630
输出样例:
3
567
思路 :
题目要求输入一个数,输出最长的最小连续因子,而输出数据特征:起始值,连续长度。由于数N在【sqrt(N),N】不可能存在连续因子,所以我们只需在【2,sqrt(N)】区间以不同的起始值,更新最终起始值(start)和连续因子长度(maxcount)即可

注意:对于素数,连续因子就是本身,且长度为1(测试点5/6)

#include
#include
using namespace std;
int main() {
	int N, temp;
	int count = 0, maxcount = 0, start = 0;
	cin >> N;
	for (int i = 2; i <= sqrt(N) ; i++) {
		temp = N;
		count = 0;
		int j = i;
		while (temp%j==0) {
				temp /= j++;
				count++;			
		}
		if (count > maxcount) {
			maxcount = count;
			start = i;
		}	
	}
	if (maxcount) {
		cout << maxcount << endl;
		for (int i = 0; i < maxcount; i++) {
			cout << start + i;
			if (i != maxcount - 1)
				cout << "*";
		}
	}
	else
		cout <<"1"<<endl<< N;
	return 0;
}

L1-009 N个数求和

L1-011 A-B

这题也是水题 但了解到了C++里String库中replace方法所以记录一下
利用getline方法可以解决把空格视作结束标志的问题

#include 
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	string a,b;
	getline(cin,a);
	getline(cin,b);
	int num1=a.size();
	int num2=b.size();
	for(int i=0;i<num2;i++)
	{
		for(int j=0;j<num1;j++)
		{
			if(a[j]==b[i])
			{
				a.replace(j,1,"");
				j--;//因为替换过后位置也随之往前移了所以这里做个j--
			}
		}
	}
	cout<<a;
	return 0;
}

L1-015 跟奥巴马一起画方块

这题主要是四舍五入算法 查了一下 没看懂- - 麻烦懂的大神指教一下

                                           2.1             2.6                -2.1               -2.6
floor : 不大于自变量的最大整数             2                2                  -3                  -3
ceil   :不小于自变量的最大整数             3                3                  -2                  -2
round:四舍五入到最邻近的整数               2                3                  -2                  -3
 
floor(),ceil() 需包含头文件<math.h>
 
C++中没有直接的round函数 需自己建立
double round(double r)
{
    return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
#include 
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int round_double(double number)
{
    return (number > 0.0) ? (number + 0.5) : (number - 0.5); 
}
int main()
{
	double n;
	char c;
	cin>>n>>c;
	float rows=round_double(n/2);
	for(int i=1;i<=rows;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<c;
		}
		cout<<endl;
	}
	return 0;
}

L1-016 查验身份证

这题想放一下主要是因为第一次测试的时候测试点2没通过 然后发现结尾是X的话就算身份证正确也会被认为是错误的 找了半个小时发现是int校检码数组时X会被认为是88 而X-‘0’是40 这是调整了一下四个测试点全过了

#include 
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	char a[20];
	int b[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},c[]={1,0,40,9,8,7,6,5,4,3,2};
	int n,flag=0;
	cin>>n;
	while(n--)
	{
		cin>>a;
		int flag1=0;
		int sum=0;
		
		for(int i=0;i<17;i++)
		{
			sum+=(a[i]-'0')*b[i];
			if(a[i]>'9'||a[i]<'0')
			{flag1=1;
			break;}
		}
		int z=sum%11;
		if(((a[17]-'0')!=c[z])||flag1)
		{
			cout<<a<<endl;
			flag=1;
		}
			
	}
	if(flag==0)
	cout<<"All passed"<<endl;
	return 0;
}

L1-017 到底有多二

这题写了有点久 下楼吃了个夜宵回来就出来了- -夜间不适合A题

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	char s[51];
	float zf=1,jo=1;//zf代表正负倍数,jo表示奇偶倍数
	int count=0;
	cin>>s;
	int k=0;
	for(int i=0;s[i]!='\0';i++)
	{
		k++;
	}
	if(s[0]=='-')
	{zf=1.5;
	 k--;}
 	if(s[0]!='-')
	{if(s[k-1]%2==0)
	jo=2;}
	else 
	if(s[k]%2==0)
	jo=2;
	for(int i=0;i<k;i++)
	{
		if(s[i]=='2')
		count++;
	}
	float sum;
	sum=(count*zf*jo)/k*100;
	printf("%.2f%%",sum);
	return 0;
}

L1-020 帅到没朋友

记这题是因为自己写的代码只通过两个测试点 而且最后一个测试点提示超时
看了一下大神的代码换了一下思路

#include
 
int main()
{
    //初始化Person数组,从0到99999
    int Person[100000]={0};//这里发现如果不初始化的话第四个测试点无法通过
    int N,n,m;
    int K;
    int i,j;
    int sum=0;
 
    //输入组数
    scanf("%d",&N);
    //输入并处理各个朋友圈
    for(i=1;i<=N;i++)
    {
        scanf("%d",&n);
        for(j=1;j<=n;j++)
        {
            scanf("%d",&m);
            //避免有些只有一个人的朋友圈重复添加产生的影响
            if(n!=1)
            Person[m]+=n;
        }
    }
 
    //输入需要排查的数据
    scanf("%d",&K);
    for(i=1;i<=K;i++)
    {
        scanf("%d",&m);
        //判断是否为没有开朋友圈或自恋狂
        if(Person[m]==0)
        {
            if(sum!=0)
                printf(" ");
            printf("%05d",m);
 
            //避免多次被检测
            Person[m]=-1;
            sum++;
        }
    }
 
    //没有开朋友圈的情况
    if(sum==0)
        printf("No one is handsome");
    printf("\n");
 
    return 0;
}

解本题主要思想:将题目从相对复杂的情况,变成非常简单的计数问题

L1-025 正整数A+B

L1-027 出租

这题主要是想办法从电话号码中得到一个从大到小排列且不重复的arr[] 还是看了一下大神的代码才换一种思路 不得不说对我这种小白简直是顿悟

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	string s;
	int a[10]={0},index[10],num=0;
	cin>>s;
	for(int i=0;i<11;i++)
	{
		a[s[i]-'0']++;
	}
	int arr[10],j=0;
	printf("int[] arr = new int[]{");
	for(int i=9;i>=0;i--)
	{
		if(a[i]!=0)
		{arr[j]=i;
		if(j!=0)
		cout<<",";
		cout<<arr[j];
		j++;
		}
	}
	printf("};\n");
	printf("int[] index = new int[]{");
	for(int i=0;i<s.size();i++)
	{
		for(int m=0;m<j;m++)
		{
			if(s[i]-'0'==arr[m])
			{
				index[num]=m;
				if(num!=0)
				cout<<",";
				cout<<index[num];
				num++;
			}
		}
	}
	printf("};\n");
	return 0;
}

L1-028 判断素数

这题是因为0和1不是质数也不是合数
质数定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int isPrime(ll x)
{
	for(int i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)
		{
			return 0;
		}
	}
	return 1;
}
int main()
{
	int n;
	ll x;
	cin>>n;
	while(n--)
	{
		cin>>x;
		if(isPrime(x)&&x!=0&&x!=1)
		cout<<"Yes"<<endl;
		else
		cout<<"No"<<endl;
	}
	return 0;
}

L1-033 出生年

这题先放了一会后来才做的 第一眼看的时候觉得太麻烦了 后来看看通过率也不是什么神题 看了下大神的代码换了个思路就出来了

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	int y,n;
	cin>>y>>n;
	int k=y;
	while(1)
	{
		int sum=0,a[10]={0};
		int num[4]={0};
		num[0]=k/1000;
		num[1]=k/100%10;
		num[2]=k/10%10;
		num[3]=k%10;
		for(int i=0;i<4;i++)
		{
			a[num[i]]++;
		}
		for(int i=0;i<10;i++)
		{
			if(a[i]!=0)
			sum++;
		}
		if(sum==n)
		break;
		k++;
	}
	printf("%d %04d",k-y,k);
	return 0;
}

L1-034 点赞

本题思路:建一个数组直接判断每个数出现的次数,出现多的覆盖掉出现少的,如果次数一样那就判断数的大小,谁大记录谁

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
	int n,k,b,a[1001]={0},maxcount=0,j=0;//b为输入的数字,maxcount和j
	//分别为出现次数和出现最多的数组下标 
	cin>>n;
	while(n--)
	{
		cin>>k;
		for(int i=0;i<k;i++)
		{
			cin>>b;
			a[b]++;
	 		if(a[b]>maxcount)
		 	{
	 			maxcount=a[b];
 				j=b;
	 		
	 		}
	 		else if(a[b]==maxcount)
	 		{
		 		if(b>j)
		 		{
		 			maxcount=a[b];
		 			j=b;
		 		}
		 	}
		}
	} 
	cout<<j<<" "<<a[j]<<endl;
	return 0;
}

在本段代码里a数组负责存放输入数字出现过的次数,maxcount记录一个数字最多出现几次,而j负责记录那个出现最多的数的下标

L1-035 情人节

本题是再一次使用string类型 所以记录一下 这里发现字符串前不能像int一样在变量前直接用! 还有最后如果用printf输出的话 需要用.c_str() 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
	string s,a,b;
	int i=0;
	while(cin>>s)
	{
		if(s==".")
		break;
		i++;
		if(i==2)
		{
			a=s;
		}
		if(i==14)
			b=s;
	}
	
	if(i>=14)
	{
		cout<<a<<" and "<<b<<" are inviting you to dinner..."<<endl;
	}
	else if(i>=2)
	{
		cout<<a<<" is the only one for you..."<<endl; 
	}
	else
	{
		cout<<"Momo... No one is for you ..."<<endl;
	}
	return 0;
	
}

L1-039 古风排版

这题坑很多 自己写了一个小时才A掉 菜是原罪
总结一下:如果字符串长度不是n的倍数,则输出空格补全 这里我是在纸上列了一下找了一下规律

T   h   i   s       i   s       a        t    e    s    t         c    a    s    e
0   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18

a s a   T  		16  12  8  4  0         这里给大家列出规律应该就不难了,每n个
s t   i h  		17  13  9  5  1         数字进行换行,每行开头的数字与后一位差
e   t s i  		18  14 10  6  2         n,所以本题主要在于开头这个数字如何获得
  c e   s  		19  15 11  7  3     	考虑完以上综合因素,便能A题了

团体程序设计天梯赛-练习集_第1张图片

#include 
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
	int n;
	string s;
	cin>>n;
	getchar();
	getline(cin,s);
	int l=s.size();
	int m=l%n;
	int p=l/n;
	if(m!=0)
 	for(int i=0;i<n-m;i++)
 	{
	 	s+=" ";//m为当s长度不足为n的倍数时补齐空格的个数 
 	}
 	int i=(m==0)?(p-1)*n:p*n;//p为列数,n为行数,m为s长度取余 
 	int q=0;
	for(i;q<n;i++,q++)
	{
		for(int j=i;j>=0;j-=n)
		{
			cout<<s[j];
		}
		cout<<endl;
	}
	return 0;
	
}

这里贴一个某位大佬对本题坑点的分析

L1-043 阅览室

本题有几个坑 改了几次才全A掉 这里我标一下

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	int n,no,h,m,time[1001],flag[1001]={0},cnt;
	double totaltime;
	char a;
	cin>>n;
	while(n--)
	{
		totaltime=0,cnt=0;
		while(1)
		{
			scanf("%d %c %d:%d",&no,&a,&h,&m);
			if(no==0)
			break;
			else if(a=='S')
			{
				flag[no]=1;
				time[no]=h*60+m;
			}
			else if(a=='E'&&flag[no]==1)
			{
				totaltime+=h*60+m-time[no];
				cnt++;
				time[no]=0;//在一次完整的书借阅完成后要清空time和flag数组中的记录 否则下一次借阅会出现问题
				flag[no]=0;//同上
			}
			
			
		}
		
		if(cnt==0)//之前一直想为什么没有这个if程序遇到没有借阅记录就无法进行,后来发现是除数为零程序出现错误
		cout<<"0 0"<<endl;
		else
		cout<<cnt<<" "<<int(totaltime/cnt+0.5)<<endl;//要注意四舍五入以整数形式输出
		
	}	
	return 0;
}

L1-044 稳赢

本题很简单但自己不够细心 提交第5次才A掉 都是一些小地方没考虑到

#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
	int k;
	cin>>k;
	string s;
	int n=k;
	while(cin>>s)
	{
		if(s=="End")
		break;
		if(n==0)
		{
			cout<<s<<endl;
			n=k+1;
		}
		else if(s=="ChuiZi")
		cout<<"Bu"<<endl;
		else if(s=="JianDao")
		cout<<"ChuiZi"<<endl;
		else
		cout<<"JianDao"<<endl;
		n--; 
	}
	return 0;
}

L1-046 整除光棍

这题写出来后我自己都在笑自己 本来按自己思路写了一下发现测试点1 2超时了- -意料之中 然后看了一下其他人的代码 知道一个模拟竖式除法的方式 查了一下竖式除法原来就是小学算术这玩意 心态崩了
团体程序设计天梯赛-练习集_第2张图片

#include
using namespace std;
int main()
{
	int x,s=0,n=0;//定义除数,被除数,位数 
	cin>>x;
	while(s<x)
	{
		s=s*10+1;//被除数末位添1直到不小于被除数 
		n++;//位数增1 
	}
	while(true)//开始进行除法运算 
	{
		cout<<s/x;//输出商 
		s%=x;//被除数更新为余数 
		if(s==0)break;//余数为0则结束 
		s=s*10+1;//余数末位添1
		n++;//位数增1 
	}
	cout<<' '<<n;
	return 0;
}

L1-048 矩阵A乘以B

15分的题居然又让我写了一个多小时 手动狗头
做这题还先要了解一下矩阵乘法是个什么东西
团体程序设计天梯赛-练习集_第3张图片
看懂了之后就可以开始写代码了 前面输入数组的部分就不说了
我们主要来看看矩阵乘法求和部分团体程序设计天梯赛-练习集_第4张图片
可以看到第40行代码是一条公式 如何构造出我们需要的循环就成为了一个难点,由输出样例我们可以得到一个两次的大循环,一个四次的内循环,但得到一个数还需要3次相乘,即a数组的列数,所以我们再建立一个三次的小循环,而在这一层循环中,最重要的是找到数组下标间的关系,写出正确的关系式后便能AC了

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	int rowa,cola,rowb,colb;
	cin>>rowa>>cola;
	int a[rowa][cola];
	for(int i=0;i<rowa;i++)
	{
		for(int j=0;j<cola;j++)
		{
			cin>>a[i][j];
		}
	}
	cin>>rowb>>colb;
	int b[rowb][colb];
	for(int i=0;i<rowb;i++)
	{
		for(int j=0;j<colb;j++)
		{
			cin>>b[i][j];
		}
	}
	if(cola==rowb)
	{
		cout<<rowa<<" "<<colb<<endl;
		for(int m=0;m<rowa;m++)//cola,rowa为a的列数,行数,colb,rowb为b的列数,行数
		{	
			for(int n=0;n<colb;n++)
			{
				int sum=0;
				for(int i=0;i<cola;i++)
				{
					sum+=a[m][i]*b[i][n]; 
				}
				if(n!=0)
				cout<<" ";
				cout<<sum;
			}
			cout<<endl;
			
		}
	}
	else
	printf("Error: %d != %d",cola,rowb);
	
	
	return 0;
}

L1-049 天梯赛座位分配

这题本来看不懂 就放了两天 一阶段的题做的差不多了又回来看还是看不懂题目的意思- -菜的不行 比如为什么到80之后就只有82 84,81 83去哪里了 于是看了超多大神的代码 开始有点理解到80的时候就是题目所说的只剩下一个学校的时候 隔位坐,并且可以看到输入的各个学校队伍数即为每行的行数,那这样就可以开始写代码了
说一下大神的思路:记录下队伍数的最大值 遍历的时候会用到它,把每个学校所需要的位置数标记为1
遍历的时候外层为所有学校的最多选手,内层循环为第i所学校,首先它得被标记过 用一个flag标记它的上一个学校是不是跟他一样 ,一样的话说明只剩下他一所学校了,即隔位cnt+2 否则cnt+1
输出的时候判断下就ok了
这里重点提醒一下 memset这个函数必须要使用 否则第五个测试点无法通过 具体原因我也不太清楚 还是要多刷题

#include
#include
#include
#include
#include
#include 
#include
using namespace std; 
int main()
{
	int a[101][101],n,m,max=0;
	memset(a,0,sizeof(a));
 	cin>>n;
  	for(int i=1;i<=n;i++)
	{
		cin>>m;//m为各个学校队伍数,max记录最大的队伍数
		if(m>max)
		max=m; 
		for(int j=1;j<=m*10;j++)
		{
		 	a[i][j]=1;//将有人的地方做好标记 
		 }
	
  	}
	int cnt=0,flag=0;//用一个flag作为上一个人的学校的标记  
 	for(int i=1;i<=max*10;i++)
 	{
	 	for(int j=1;j<=n;j++)
	 	{
	 		if(a[j][i])
	 		{
	 			if(flag!=j) //每次都判断前后两位学校是否一致 
	 			{
	 				cnt++;
			 		a[j][i]=cnt;
		 			flag=j;
			 	}
			 	else      //一致则说明是最后一个学校的队伍了 
			 	{
	 				cnt+=2;
	 				a[j][i]=cnt;
	 				flag=j;
	 			}
		 		
		 	}
	 	}
	 }
	 for(int i=1;i<=n;i++)
	 {
	 	cout<<"#"<<i<<endl;
 		for(int j=1;j<=max*10;j++)
 		{
		 	if(a[i][j])
			 {
			 	cout<<a[i][j];
 				if(j%10==0)
			      	cout<<endl;
    			else
    			cout<<" ";
     		
 			} 
		 }
 	}
	return 0;
}

L1-050 倒数第N个字符串

这道题虽说就15分 但在我眼里和上一题是一样的存在- - 这次学了一下vector怎么使用 暂时理解为动态数组 可以存放任何类型的数据

L1-054 福到了

这道题对输入格式的要求很高,如果会用scanf和gets那就很简单了 我不会用gets所以用了scanf- - 测试了一下scanf是可以将空格当成char读入的
突然想到还有个比较重要的点 像这样的输入一定要用getchar()来吸收掉回车,不然会影响输入的
本题思路:其实很简单 把一个数组倒序输出就好了 但如何判断是否不用倒了我看了一下其他人的代码 然后一直在想为什么直接在第一个大循环里判断是否相同为什么不行,后来发现如果这样做会导致getchar使用出现错误 导致WA 还是老实点再建一个循环判断好了

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	int n,flag=0;
	char a[111][111],x;
	cin>>x>>n;
	getchar();
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%c",&a[i][j]);
			if(a[i][j]!=' ')
			{
				a[i][j]=x;
			}
		}
		getchar();
		
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i][j]!=a[n-i-1][n-j-1])
			flag=1;
		}
		
	}
	if(!flag)
	cout<<"bu yong dao le"<<endl;
	for(int i=n-1;i>=0;i--)
	{
		for(int j=n-1;j>=0;j--)
		{
			cout<<a[i][j];
			if(j==0)
			cout<<endl;
		}
		
	}
	
	return 0;
}

L1-058 6翻了

又是做了一小时的题目- -做到后期心态都快崩了 15分的题怎么会这么难 A掉后看了一下通过率 还好还好 不过思路至少是正确的

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	string s;
	int cnt=0,k;
	getline(cin,s);
	for(int i=0;i<=s.size();i++)
	{
		if(s[i]=='6')
		{
			k=i;
			cnt++;
		} 
		else if(cnt<=3)
		cnt=0;
		else{
			if(cnt>3&&cnt<=9)
		{
			s.replace(k-cnt+1,cnt,"9");
			i=i-cnt;//因为替换过后整个数组的下标其实就发生了变化所以这里进行改变
			cnt=0;
			
		}
		if(cnt>9)
		{
			s.replace(k-cnt+1,cnt,"27");
			i=i-cnt;//因为替换过后整个数组的下标其实就发生了变化所以这里进行改变
			cnt=0;
		}
		}
		
	}
	cout<<s<<endl;
	return 0;
}

L1-059 敲笨钟

半小时左右出来了- -但是后来改改改 到最后还是有个测试点没通过,报错提示是运行时错误 经过多次提交怀疑是compare函数的问题 改了一下果然能A了
有些大神好像使用正则表达式写的 我还是有点看不太懂就没去用 我太菜了

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
	int n,k1,k2,k,l;
	string s;
	cin>>n;
	getchar();
	while(n--)
	{
		getline(cin,s);
		k1=s.find(",");
		k2=s.find(".");
		if(s[k1-1]!='g'||s[k1-2]!='n'||s[k1-3]!='o'||s[k2-1]!='g'||s[k2-2]!='n'||s[k2-3]!='o')
		//if(s.compare(k1-3,3,"ong")!=0||s.compare(k2-3,3,"ong")!=0)
		{
			cout<<"Skipped"<<endl;
		}
		{
			cout<<"Skipped"<<endl;
		}
		else
		{
			int ans=0;
			for(int i=k2-1;;i--)
			{
				if(s[i]==' ')
				ans++;
				if(ans==3)
			 	{
 					k=i+1;
 					l=k2-k;
 					break;
 				}
			}
			s.replace(k,l,"qiao ben zhong");
			cout<<s<<endl;
		}
	}
	return 0;
}
/*
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.*/

L2-001 紧急救援

待我学完最短路再来- - 没学过完全看不懂代码

你可能感兴趣的:(ACM)