[NOIP1998 普及组] 三连击
复制题目可能有错,请用你手头上的
题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将 1,2,…,91,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1:2:3 的比例,试求出所有满足条件的 3 个三位数。
输入格式
无
输出格式
若干行,每行 3 个数字。按照每行第 1 个数字升序排列。
输入输出样例
输入 #1复制
无
输出 #1复制
192 384 576 * * * ... * * * (剩余部分不予展示)
说明/提示
NOIP1998 普及组 第一题
代码(All AC)
#include<bits/stdc++.h>
using namespace std;
int a[10];
void cf(int x)
{
for(int i=x;i>0;i/=10)a[i%10]++;
}
void cs()
{
for(int i=0;i<=9;i++)a[i]=0;
}
bool pd()
{
if(a[0]!=0)return false;
for(int i=1;i<=9;i++)if(a[i]>=2)return false;
return true;
}
int main()
{
//freopen("test.out","w",stdout);
for(int i=192;i<=999;i++)
{
cs();
int j=i*2,k=i*3;
cf(i);cf(j);cf(k);
if(pd()&&i<=999&&j<=999&&k<=999)printf("%d %d %d\n",i,j,k);
}
//fclose(stdout);
return 0;
}
变量解释
cf 数字拆分 并统计次数去a数组(计数)
cs 重置 归0
pd判断 题目说只用到1~9 有0就F 有一个数子统计大于2就F 最后T
主函数 题目给了第一个是192 我们从192开始枚举到999(400就行)
第2个数就是192*2(i*2) 第3个192*3(i*3)
就有如上ALL AC 代码 Do you know it?
[NOIP2011 普及组] 统计单词数
复制题目可能有错,请用你手头上的
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
输入格式
共 2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 −1。
注意:空格占一个字母位
输入输出样例
输入 #1复制
To to be or not to be is a question
输出 #1复制
2 0
输入 #2复制
to Did the Ottoman Empire lose its power at that time
输出 #2复制
-1
说明/提示
数据范围
1≤1≤ 第一行单词长度 ≤10
1≤1≤ 文章长度 ≤10^6
noip2011 普及组第 2 题
两次提交 第一次踩坑了(先讲第一次思路)
因为:如果给定单词仅是文章中某一单词的一部分则不算匹配
就有了while(cin>>s) 因为不分大小写 所以把他们全部变成小写!
位置的话加多一个空格
20分代码
#include<bits/stdc++.h>
using namespace std;
string xiaoxie(string str)
{
for(int i=0;i<str.size();i++)if(str[i]>='A'&&str[i]<='Z')str[i]=str[i]-'A'+'a';
return str;
}
string s,st;int ans,no1=-1,id;
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
cin>>s;
while(cin>>st)
{
if(xiaoxie(s)==xiaoxie(st))
{
ans++;
if(no1==-1)no1=id;
}
id+=st.size()+1;
}
if(ans==0)cout<<-1;
else cout<<ans<<" "<<no1;
//fclose(stdin);
//fclose(stdout);
return 0;
}
恭喜出错!!!
数据1(非样例) 两个空格😀
所以只能老老实实getline
判断这个是不是小写(前提是变量小写后)
不是就看这个串是不是 是的话记录(无论是不是都要归空字符串)
变量解释:s 那一行字符串
pd 第一行字符串
st=记录空格前后的字符串
no1=number 1第一次出现位置
ALL AC
#include<bits/stdc++.h>
using namespace std;
string xiaoxie(string str)
{
for(int i=0;i<str.size();i++)if(str[i]>='A'&&str[i]<='Z')str[i]=str[i]-'A'+'a';
return str;
}
string s,st,pd;int no1=-1,t;
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
cin>>pd;
getchar();//吃回车
getline(cin,s);//不可以while(cin>>s)可能有多个空格
s=xiaoxie(s);pd=xiaoxie(pd);//都变小写
for(int i=0;i<s.size()-1;i++)
{
if(s[i]>='a'&&s[i]<='z')st=st+s[i];
else
{
if(st==pd)
{
t++;
if(no1==-1)no1=i-st.size();
}
st="";//归空
}
}
if(t!=0)cout<<t<<" "<<no1;
else cout<<-1;
//fclose(stdin);
//fclose(stdout);
return 0;
}