寒假每日一题(六)


一、 不高兴的津津

题目链接
津津上初中了。

妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。

另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。

但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。

假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。

请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入格式
输入文件包括七行数据,分别表示周一到周日的日程安排。

每行包括两个小于 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;
}

 

总结

漫漫长路

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值