3.22 每日一题题解

Farewell Party

题目链接:https://codeforces.com/problemset/problem/1081/B

涉及知识点:

  • 思维/构造

solution:

  • 考虑颜色不同的人数不是很好想,下面我们考虑帽子颜色相同的人数
  • 样例2的3 3 2 2 2,反过来就是2 2 3 3 3
  • 这样是不是就能看出来如何判断了,把颜色相同的人加到一起,如果加起来人的个数 = 对应颜色相同的人数,就对了
  • 当然不是!
  • 如果输入 2 2 2 2 ,我们会输出Impossible,其实我们忽略了一个地方,我们其实只需要判断加起来人的个数是不是对应颜色相同的人数的整数倍即可
  • 对于样例 2 2 2 2,相加起来的人的个数 = 4,对应颜色相同的人数 = 2,那么第一个和第二个人颜色相同,第三个人第四个颜色相同即可

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int a[maxn],ans[maxn];
vector<int> v[maxn];
int main()
{
    int n,x;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x , x = n - x;
        v[x].push_back(i);
    }
    int cnt = 1;
    for(int i=1;i<=n;i++){
        int siz = v[i].size();
        if(siz%i != 0){
            cout<<"Impossible"<<endl;
            return 0;
        }
        for(int j=0;j<siz;j++){
            ans[v[i][j]] = cnt;
            if((j+1)%i == 0)
                cnt++;
        }
    }
    cout<<"Possible"<<endl;
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<" ";
    return 0;
}

原文地址:https://www.cnblogs.com/QFNU-ACM/p/12544203.html

时间: 2024-10-07 07:59:01

3.22 每日一题题解的相关文章

3.25 每日一题题解

tokitsukaze and Soldier 题目链接:https://ac.nowcoder.com/acm/problem/50439 涉及知识点: 优先队列/贪心 solution: 每个士兵都有战力Vi和一个限制Si,我们先按照每个士兵的Si从大到小进行排序 然后我们根据排好序的士兵遍历 因为士兵的Si从大到小,所以遍历的过程中,当前遍历的士兵对应的si一定是最小 所以我们可以维护一个大小由Si较小的优先队列 如果队列大小小于当前遍历士兵的Si,就扔到优先队列里,一旦士兵的人数超过限制

3.21 每日一题题解

小K的疑惑 题目链接:https://ac.nowcoder.com/acm/problem/20823 涉及知识点: 思维/搜索/简单图论 solution: 题目要求??????(??,??) = ??????(??,??) = ??????(??,??) ,首先要满足每两个节点的距离都是偶数,即??????(??,??) = ??????(??,??) = ??????(??,??) = 0 由于树上任意两点的距离是唯一的,所以如果i到j的距离是奇数,j到k的距离是奇数,那么i到k的距离一

3.31 每日一题题解

Arpa's obvious problem and Mehrdad's terrible solution 题目链接:http://codeforces.com/problemset/problem/742/B 涉及知识点: 数学 solution: 题意就是让你找出给定数列里两两异或值为x的组合个数 暴力n方,会超时 根据异或运算性质:a^b=x; x^a=b; x^b=a; 所以可以直接O(n)的遍历每一个数,查找x异或这个数是否存在即可 std: #include <bits/stdc+

4.6 每日一题题解

三角形 题目链接:https://ac.nowcoder.com/acm/contest/4911/B 涉及知识点: 背包dp solution: 背包是dp算法中非常经典的一个问题(如果打算学dp的同学必须要学会背包问题),具体的大家可以看我发在群里的背包九讲pdf 关于这道题目,我们可以对每一个宝箱做一个背包 题目要求从每一个宝箱中有且只能取一个,所以设dp[i][j]为枚举到第i个宝箱,可以获得钱数等于j的方案数 那么转移方程就等于 dp[ i ][ z ] += dp[ i-1 ][ z

4.11 每日一题题解

完全平方数 题目链接:https://ac.nowcoder.com/acm/contest/37/A 涉及知识点: 暴力/二分 solution: \(祝大家周末愉快\) \([1,n]区间的完全平方数的个数等于\) \(\sqrt{n}\) \([L,R]区间的完全平方数的个数可以理解为\) $\sqrt{R} - \sqrt{L-1} $ \(0也是完全平方数,L和R是否为0判断一下即可\) \(当然将所有平方数放入数组,lowerbound二分也是时间复杂度允许的可行解\) std: #

老男孩教育每日一题-2017年5月22日-命令风暴:变量a=’a/b/c’如何截取得到c

1.题目 2.参考答案 系统环境 [[email protected] ~]# uname -r2.6.32-504.el6.x86_64 [[email protected] ~]# cat /etc/redhat-releaseCentOS release 6.6 (Final) [[email protected] ~]# a='a/b/c' 方法1-cut [[email protected] ~]# echo $a | cut -c5c 方法2-tr替换 [[email protect

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-17 09:29:

C语言每日一题之No.9

再做决定之前,我还是做好自己该做的.我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦.尊敬的女王陛下,请接题: 一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出"abdefghjkmnptwy". 二.思路:既然是已经排好序的,就用二分法查找的思想 将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入 三.程序 1 #include <stdio.h> 2 #include <string.

C语言每日一题之No.1

鉴于在学校弱弱的接触过C,基本上很少编程,C语言基础太薄弱.刚好目前从事的是软件编程,难度可想而知.严重影响工作效率,已无法再拖下去了.为此,痛下决心恶补C语言.此前只停留在看书,光看好像也记不住,C这东西毕竟是练出来的,所以从今天开始,每日一道C语言题目,从题目入手来补知识漏洞.题目比较基础,如不堪入目,还请见谅. 题目:输入三个整数,输出最大的数 思路:定义三个变量用来存储输入的整数 比较三个变量的大小,找到最大的数 定义一个变量存储来存储最大的数 程序: 1 #include <stdio