首页 > 其他分享 >2024国庆做题总结

2024国庆做题总结

时间:2024-09-28 21:34:12浏览次数:1  
标签:总结 10 int 位置 2024 read while 国庆 冲突

Secret Santa

思路

这是一个需要深思熟虑的贪心,总之还算有点复杂。

首先,如果一个数不在它自己数值的下标上,就可以填进去,将剩下的还未填的数记录下来,此时情况如下(样例1,第一组):

当前:2 1 _
剩余:3

然后将剩余的数的那个数组反过来,即从大到小排序,填满空位,这样可能会有冲突,但是,可以证明只会有一个冲突。

证明:\(x,y,z\) 为下标,\(a,b,c\) 分别为 \(x,y,z\) 上的数值,假设 \(y = b\),因为 \(x < y < z\) 且 \(a > b > c\),所以其余任何位置都无冲突。

那么如何解决掉冲突呢,将冲突位置上的值替换为之前这个位置上的值即可,再将之前这个位置上的值的现在的位置上的值改为冲突位置的值,这样就不会有冲突。

原来:2 1 3 位置 3 上有冲突
更改后:3 1 2 (第三个位置改为原来的值,第一个位置改为 3)

显然这种方案变换次数最少。

代码

#include<iostream>
#include<vector>
using namespace std;

inline int read(){register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9'){if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return x * f;}
inline void write(int x){if (x < 0) putchar('-'), x = -x;if (x > 9) write(x / 10);putchar(x % 10 + '0');}

const int N = 2e5 + 10;
int T, n, ans;
int a[N], b[N], cnt[N], tot;
vector<int> v[N];
bool vis[N], f[N];

int main(){
    T = read();
    while (T--){
        n = read();
        for (int i = 1; i <= n; i++) a[i] = read(), v[a[i]].push_back(i);
        for (int i = 1; i <= n; i++){
            for (auto j : v[i]){
                if (!vis[j] && i != j){
                    b[j] = i;
                    vis[j] = 1;
                    f[i] = 1;
                    break;
                }
            }
            if (!f[i]) cnt[++tot] = i;
        }
        for (int i = 1, l = tot; i <= n && l >= 1; i++){
            if (!vis[i]) b[i] = cnt[l], l--;
        }
        for (int i = 1; i <= n; i++){
            if (b[i] == i) swap(b[i], b[v[a[i]][0]]);
        }
        for (int i = 1; i <= n; i++){
            if (a[i] == b[i]) ans++;
        }
        cout << ans << '\n';
        for (int i = 1; i <= n; i++) cout << b[i] << ' ';
        cout << '\n';
        for (int i = 1; i <= n; i++) a[i] = b[i] = cnt[i] = vis[i] = f[i] = 0;
        for (int i = 1; i <= n; i++) v[i].clear();
        tot = ans = 0;
    }
    return 0;
}

标签:总结,10,int,位置,2024,read,while,国庆,冲突
From: https://www.cnblogs.com/bryceyyds/p/18438463

相关文章

  • 2024初秋集训——提高组 #25
    A.数一下题目描述给定一个正整数\(N\),求\(N\bmod1,N\bmod2,\dots,N\bmodN\)中有多少个不同的值。思路我们对\(N\bmodi\)的\(i\)进行分类讨论:\(i\ge\lceil\frac{N}{2}\rceil\),那么\(N\bmodi=N-i\),所以这部分包含了\(0\)到\(\lfloor\frac{N}{2}\rfloor\)。......
  • 2024-2025 20241312 《计算机基础与程序设计》第一周学习总结
    作业信息|这个作业属于哪个课程|2024-2025-1-计算机基础与程序设计)|||这个作业要求在哪里|2024-2025-1计算机基础与程序设计第一周作业)|----||这个作业的目标|快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解......
  • 2024-09-28学习吴军博士《态度》笔记
    1.要注意你的态度,因为它影响你的想法。要注意你的想法,因为它决定你的言辞和行动。要注意你的言辞和行动,因为它主导你的行为。要注意你的行为,因为它会变成你的习惯。要注意你的习惯,因为它塑造你的性格。要注意你的性格,因为它决定你的命运。————撒切尔夫人,吴军博士补充第......
  • 2024-2025-1 学号20241315《计算机基础与程序设计》第一周学习总结
    作业信息|这个作业属于哪个课程|2024-2025-1-计算机基础与程序设计)|||这个作业要求在哪里|2024-2025-1计算机基础与程序设计第一周作业)|----||这个作业的目标|快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解......
  • 记一次参观2024上海工博会
    工博会期间地铁17号线可以直接在渚光路直达到工博会会场了,当然2号线可以直接进,大是真的大,50门票到也不亏这次来的主要目的是开发潜在的客户,但是进去了之后才发现里面全是卖自己产品,推销自己的工业设备的,也就是希望你成为他们的客户,凑到展台全是在讲自己产品的,这也合理,毕竟我们公......
  • 2024-2025-1 20241316 《计算机基础与程序设计》第一周学习总结
    2024-2025-120241316《计算机基础与程序设计》第一周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第一周作业这个作业的目标<浏览教材并提出问题>作业正文https://www.cnblog......
  • 必可2024公益众筹赛2 之趋势赛记
    鲜花挂分挂麻了。赛时7:50~9:00开始先看第一题,看到第一题这么简短就想都没想直接开做了,到\(8:20\)左右的时候就想到可以直接字符串哈希,然后枚举插入字母的位置\(O(1)\)判断去除字母后两个串是否一样就可以了。然后就写写写,写的时候发现分讨插入字母的大致位置比较好些,于是......
  • 学期2024-2025-1学号20241411《计算机基础与程序设计》第一周学习总结
    作业信息|班级的链接|2024计算机基础与程序设计||作业要求的链接|第一周作业||作业的目标|1、参考教程安装Linux系统;2、快速......
  • 2024-2025-1 20241403 《计算机基础与程序设计》第一周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标1浏览《计算机科学概论》,并对应每章提出相应的问题;2安装Linux并学习一些基础命令,安......
  • 2024.9.28 代码源模拟赛
    省流:\(45+20+5+0=70\)简称:唐诗在此膜拜\(klz\)\(Heldivis\)\(Sorato\)\(czl\)\(Ech0\_7\)yxanslihe_qwq大佬T1先看的T1,想了一个拓排(其实是看错题了),然后过了第一个样例,然后咋调都过不去,就去码暴力了。过了大概10min发现看错题了,然后一会就想出来个\(O(n^2)\)......