一、 不高兴的津津
题目链接
津津上初中了。
妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。
另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。
但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。
假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。
请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
输入格式
输入文件包括七行数据,分别表示周一到周日的日程安排。
每行包括两个小于 10 的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
输出格式
输出文件包括一行,这一行只包含一个数字。
如果不会不高兴则输出 0,如果会则输出最不高兴的是周几(用 1, 2, 3, 4, 5, 6, 7 分别表示周一,周二,周三,周四,周五,周六,周日)。
如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
输入样例:
5 3
6 2
7 2
5 3
5 4
0 4
0 6
输出样例:
3
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int flag=0;
int h=0;
for(int i=1;i<=7;i++)
{
int a,b;
cin>>a>>b;
if(flag==0&&a+b>8)
{
h=i;flag=1;
}
}
cout<<h<<endl;
return 0;
}
二、明明的随机数
明明想在学校中请一些同学一起做一项问卷调查。
为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。
然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
请你协助明明完成“去重”与“排序”的工作。
输入格式
输入文件包含 2 行,第 1 行为 1 个正整数,表示所生成的随机数的个数:N。
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出文件也是 2 行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。
第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
数据范围
1≤N≤100
输入样例:
10
20 40 32 67 40 20 89 300 400 15
输出样例:
8
15 20 32 40 67 89 300 400
这个题就是排序、判重、输出,输出这堆不同数的第一个,就是判断他跟他前面那个数相不相等
这还有个库函数,unique
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int n;
int a[N];
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
int k=1;
for(int i=1; i<n; i++)
if(a[i]!=a[i-1])
a[k++]=a[i];//利用双指针,妙啊
cout<<k<<endl;
for(int i=0; i<k; i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
三、比例简化
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。
例如,对某一观点表示支持的有 1498 人,反对的有 902 人,那么赞同与反对的比例可以简单的记为 1498:902。
不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。
因为这个比例的数值太大,难以一眼看出它们的关系。
对于上面这个例子,如果把比例记为 5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
现给出支持人数 A,反对人数 B,以及一个上限 L,请你将 A:B 化简为 A′:B′,要求在 A′ 和 B′ 均不大于 L 且 A′ 和 B′ 互质(两个整数的最大公约数是 1)的前提下,A′B′≥AB且A′B′−AB 的值尽可能小。
输入格式
输入共一行,包含三个整数 A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
输出格式
输出共一行,包含两个整数 A′,B′,中间用一个空格隔开,表示化简后的比例。
数据范围
1≤A,B≤106,
1≤L≤100,A/B≤L
输入样例:
1498 902 10
输出样例:
5 3
暴力枚举,这里要最简分数,由于是从小到大依次枚举,所以第一个就肯定是最简的分数。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int A,B,L;
int a,b;
double delta=1e9;//定义差值
cin>>A>>B>>L;
for(int i=0;i<=L;i++)
for(int j=1;j<=L;j++)
{
double x=(double)i/j;
double X=(double)A/B;
if(x>=X&&x-X<delta)//如果新除的就比之前的精度更高
{
delta=x-X;
a=i,b=j;
}
}
cout<<a<<" "<<b<<endl;
return 0;
}
四、数字统计
请统计某个给定范围 [L,R] 的所有整数中,数字 2 出现的次数。
比如给定范围 [2,22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次。
输入格式
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出格式
输出共 1 行,表示数字 2 出现的次数。
数据范围
1≤L≤R≤10000
输入样例:
2 22
输出样例:
6
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int l,r;
cin>>l>>r;
int res=0;
for(int i=l;i<=r;i++)//枚举区间内所有的数
for(int j=i;j;j/=10)//再看他的每个位
res+=j%10==2;//这个用法就是判断是都是否为2
cout<<res;
return 0;
}
五、质因数分解
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。
输入格式
输入只有一行,包含一个正整数 n。
输出格式
输出只有一行,包含一个正整数 p,即较大的那个质数。
数据范围
6≤n≤2∗109
输入样例:
21
输出样例:
7
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
for(int p=2;;p++)//哇呜,这种题就是只找最小的
if(n%p==0)//找到
{
cout<<n/p<<endl;
break;
}
return 0;
}
六、数字反转
题目链接
给定一个整数,请将该数各个位上数字反转得到一个新数。
新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。
输入格式
输入共 1 行,1 个整数 N。
输出格式
输出共 1 行,1 个整数表示反转后的新数。
数据范围
|N|≤109
输入样例:
123
输出样例:
321
输入样例:
-380
输出样例:
-83
就是反转,如果有负号和零,就先把负号提取出来,然后尾巴的0去掉,然后反转
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string str;
cin>>str;
reverse(str.begin(),str.end());
if(str.back()=='-')
{
cout<<'-';
str.pop_back();//删除源字符串的最后的负号
}
int k=0;
while(k+1<str.size()&&str[k]=='0')//特判0
k++;
while(k<str.size())
cout<<str[k++];//就是不输出0的那几项
return 0;
}
总结
漫漫长路