木木给女朋友的项链

题解 七

我又距离期末考试更近啦!但是我还是要敲代码,写博客,因为这让我斗志昂扬哈哈哈!今天早上起床思绪万千啊,因为我前几天突然萌生了一个想法,我来到了江西理工大学,我就想在这个大学留下一点属于我的痕迹。然后我发现我们学校的OJ还没有题解,所以我想给你学校OJ写题解,哈哈!也不知道管理员老师们会不会同意我的想法。我是不是忘了我还仅仅是一个萌新。 虽然我现在还是一个萌新哈,但是等我到了大二,就差不多OJ上面的题目都能解出来了,我从现在就开始,先把简单的题目的题解写好,难的题目题解以后再出。我现在还没有和老师商量这个事情,因为我觉得我现在还是大一,确实没那个能力,也就不好意思和老师开口,我想等我到了大二,我就可以和老师开口了。到时候我直接告诉老师,我已经把大部分的题解都已经写好了,可以直接“上架”哈哈哈,想着以后的学弟学妹们可以看到我写的题解,别提有多高兴了!
好吧,我也不要高兴的太早了,万一老师不同意呢,害!废话太多了,进入正题

今天早上突然想写一道有难度的题,因为今天比较空,只有一节课。所以我就在学校OJ上面找了一道校赛的题目,一开始找了一道叫“木木的电阻”的题目,思路还是很清晰的,但是一些细节的东西还是没有想清楚,经过半个小时,无果,算了,下一题。然后找了一道类似的题目,难度也差不多,几分钟就AC了。好吧我承认这道题更简单 这个题目应该没有涉及到什么算法吧。因为我自己也没学过任何算法,所以就算题目里面包含了某种算法我也不知道,我只会暴力AC
不说了,上题目!

题目名称:木木给女朋友的项链
题目来源:江西理工大学OJ
题目地址:http://oj.jxust.edu.cn/problems/1012

题目描述
木木终于从未来穿越回来了。未来太恐怖了,但是现在更恐怖了。
因为木木女朋友的生日刚好过去了。而且木木消失了这么久,女朋友很担心呐。
现在木木很难过,因为没能够陪着女朋友过生日。
于是木木想送给他女朋友一条项链。这条项链并不是首尾相接的,就是一条链子。额~这个该如何解释呢,因为木木的女朋友是个奇葩呀,不然怎么会担心木木呢。
现在木木有很多的珠子,各种颜色的珠子,木木想用这些珠子穿出一条链子。当然大家都知道,木木很贪心的,他想把所有的珠子都给用上,一个都不能少,少了一个会憋屈死的,因为会觉得这样对不起女朋友。然而呢,木木的女朋友是个非常爱漂亮的人,她不喜欢任何两个相连的珠子的颜色是一样的。这样木木心里就挺纠结的。现在木木就是想知道这些珠子能不能穿出一条漂亮的链子。
输入
测试数据有多组,每组数据第一行为一个整数t,表示一共有t组数据。
接下来t组数据,每组数据占2行,第一行是一个整数n(0<n<=1000000)表示有多少种不同颜色的珠子,第二行是n个数字,第i个数字为Mi(0<Mi<=1000000)表示第i种珠子的个数。
输出
对于每组数据,输出一行,包含一个"Yes"或者"No"。
样例输入
2
3
4 1 1
5
5 4 3 2 1
样例输出
No
Yes

这道题的话呢,看起来好复杂,好难,其实,如果我们换一种思路去考虑它,会变得很简单。(不说了,我还没吃早饭,先去吃个早饭回来咱们慢慢聊嗝~,吃饭回来啦,哈哈哈,言归正传。这个题目我想给你们画个草图,啊我的字实在是不堪入目在这里插入图片描述
在这里插入图片描述
由于那个图实在太丑了,我下载了一个工具重新画了一个,虽然不好看,但是勉强能看把
啊,我以后会提升我自己的绘图能力的,我自己都看不下去了!!
讲下这个题目的思路哈,这个题目如果你把各种球都分开来看,那未免太复杂,所以我的思路是,“我的眼里只有两种球——最多的球和剩下的球”,为什么呢?那这样,我们先将最多的球排成一排哈,然后我们把第二多的球插入最多球的空,是不是可能不够?那就再用第三多的球插入进去,还是不够?继续,以此类推,就可以发现,出了最多的球,其他的球都属于“待插入的球”,所以,剩下的球也就成了一类,和颜色其实没有多大关系,读到这里可能有同学要问了,如果剩下的球太多怎么办?没关系,按我说的插入就可以,图片里面也有一些解释,相信大家细细联想一下可以明白,如果还是想不明白,也可以像我那样子,画画图,就清楚了。

好的,整理一下思路,第一步,把球分成两类,第一类,最多的球,第二类,剩下的球;第二步,统计剩下的球的总数;第三步,判断,如果(总数-最大数)>=-1,那么就意味着可以,为什么是-1呢?因为比最多的球少一个刚刚好可以插满空,所以是-1。

步骤大概如下,第一步,建立外层循环,控制样例输入;第二步,输入球的种类数,再用用第二层循环输入每类球的个数,存放在数组里面,输入的同时我们可以用“擂台法”(逐个比较)找出最多球的种类和数量;第三步,利用循环统计剩下的球的总数;第四步,比较,并输出对应结果。

那么接下来大家就配和代码来看一下这个题目哈!

上代码!!

#include <iostream>
using namespace std;
int main()
{
    int t;
    cin >> t;
    long long int n;
    long long int sum = 0;//注意这里要用long long 因为一百万乘以一百万超过了int的范围
    int max = 0;
    int k = 0;
    int a[1000];//记得扩大,因为我的VS编译器最多开几十万,不够,所以先开小一点
    for (int i = 1; i <= t; i++)//外层循环控制样例个数
    {
        cin >> n;
        max = 0;
        k = 0;
        sum = 0;//这三个0表示要重置哦,每次都是要重置的哈!
        for (int j = 0; j < n; j++)
        {
            a[j] = 0;//数组也给它重置一下!
        }
        for (int j = 0; j < n; j++)
        {
            cin >> a[j];//输入
            if (a[j] > max)//擂台法得到最多的数以及其对应的种类
            {
                max = a[j];
                k = j;
            }
        }
        for (int j = 0; j < n; j++)
        {
            if (j != k)//如果不是最多的,那就累加起来
                sum += a[j];
        }
        if (sum - max >= -1)//进行最后的判断
        {
            cout << "Yes" << endl;
        }
        else
        {
            cout << "No" << endl;
        }
    }
    return 0;//就这么愉快的结束啦
}

这个题目我们要学的是一种思维方式,一种换角度思考的方式,有时候有的题目直接去思考它很麻烦,往往就要换一个角度去思考才能够把问题简化。

知识点总结:

  1. 用循环控制样例输入个数
  2. 每次都要重置变量
  3. 用擂台法找出最值
  4. 换角度思考问题方法
  5. 判断题目的数据范围(int or long long int)
  6. 循环的嵌套

哎,我每次写一篇题解都要“少则个把小时,长则两三小时”,这样子不行,感觉高低有点浪费时间,以后写题解就不要这么多废话了,直接进入正题,不多废话!
嘿嘿,我又我的目标更近了一步!哈哈!
好了,每篇题解都要附上一句话。

没有人天生就强、就弱或意志坚定。是后来才变强,后来才意志坚定。命运不在人身上,而在人四周。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值