简单写三道模拟题(一)

ProblemA 

ex:

 

 analyze:

//首先考虑局部的最简单的满足题意的子集,当子集长度为3同时其中两位字符相同  即三中存二(2/3)的情况 
//通过简单思考,得出结论即所有满足条件的子集都满足上述(2/3)条件,同时(2/3)情况的必然是满足条件的子集 

//所以可以题目的本质可以认为是:找任意三个连续位置的字符其满足三个字符中有两个字符相同

#include<bits/stdc++.h>
char s[100010];
char pt;
int cntk=1;
double cntall=1;
int main()
{
	scanf("%s",&s);//因为是单组数据测试而且输入只有一个字符串,所以直接选择速度最快的scanf()函数 
	int k=strlen(s);//获取读入字符串的长度,为接下来遍历字符串的每一个字符位做准备 
	for(int i=0;i<k;i++)//历字符串的每一个字符位
	{			
			if(s[i]==s[i+1]){//如果当前的字符和它的下一位相同即可满足(2/2)的情况同时也满足(2/3) 
				printf("%d %d",i+1,i+2);
				return 0;//因为是测试单组数据 所以选择找到答案后立即结束程序 下面的return也同理 
			}
			if(s[i]==s[i+2]){//如果当前的字符和它的下下一位相同即可满足(2/3)
				printf("%d %d",i+1,i+3);
				return 0;
			}
	}
	printf("-1 -1\n");//如果for循环完整走完 程序没有被满足条件的if中的return结束,说明所输入的字符串中不存在满足题意的子集输出-1,-1 
	return 0;
}

ProblemB

ex:

 

 analyze:

//123,123,123.....,每次报三的人退出队伍,最后只留下一个要判断留下的是谁

//每次都是123,123同时报到3的人要退出队伍,所以考虑用一个foot遍历标记当前报数,

//同时要分辨当前位置的人是不是已经出局,所以还需要创建一个标记数组

#include<stdio.h>
	int a[1001];//01数组,例如a[3]状态为0表示3号客人已经出局 
int main(){
	int n;
	scanf("%d",&n);
	int cnt=n;//用一个计数器判断还剩多少人每次执行踢人操作cnt--  当人数只剩一的时候结束报数 
	int foot=0;//foot范围1~3;表示当前客人的报数 
	for(int i=1;i<=n;i++){//创建1~n号客人,初始状态为1 
		a[i]=1;
	}
	while(cnt>1){//当人数大于1时,下列操作继续 
		for(int i=1;i<=n;i++)
		{
			if(a[i]==1)
			{
				foot++;//从1号客人到n号客人,如果状态为1则执行报数操作 
				if(foot==3)//当前客人如果报数为3则表示需要踢出队伍 则执行提出,报数归零,统计等操作 
				{
					a[i]=0;//踢出 
					foot=0;//报数归零 
					cnt--;//统计人数 
				}
			}
		}
	}
	for(int i=1;i<=n;i++){//寻找标记数组中还未被踢出的客人并且输出 
		if(a[i]==1)printf("%d\n",i);
	}
	return 0;
} 

ProblemC

 ex:

analyze:

//用一个标记数组即可解决此题

#include<stdio.h>
int b[101]={0};//标记数组,角标表示性格类型,存储内容为出现时的位置,例如b[7]=10 表示性格7第一次出现的位置是10 而b[3]=0表示性格3未出现过; 
int temp=0;//临时读取当前输入的数字,将temp判断后对标记数组进行操作 
int k=0;//类型数 
int n=0;//数据长度
int s=0;//记录类型个数 
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){//循环读入性格数值 
		scanf("%d",&temp);
		if(b[temp]==0){//如果当前性格类型未出现过即 b[temp]==0,则进入if,存储出现位置,统计类别数目 
			b[temp]+=i;//存储出现位置
			s++;//统计类别数目 每次出现新类型加一 
		}
	}
	if(s<k){//执行完上面的循环后如果已有类型少于要求 则输出No表示不满足 并退出 
		printf("NO\n");
		return 0; 
		
	}else{//到这一步说明已有类型数目大于等于要求数目,将b[]数组中存储的信息输出 
		int cnt=0;
		printf("YES\n");//输出yes表示数目足够,接下来遍历b数组寻找b[]中不为0的单位,输出b[]存储的位置 
		for(int i=1;i<=100&&k;i++){
			
			if(b[i]!=0){//判断b[i]是否出现过 
			printf("%d ",b[i]);	//输出i性格第一次出现的位置 
			cnt++;
			if(cnt==k)return 0;//题目要求只输出k个多余的不输出所以在此进行判断 
			}
			
		}
    
	}
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值