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个多余的不输出所以在此进行判断
}
}
}
}