牛客IOI周赛19-普及组

    科技2025-02-04  14

    Powered by:AB_IN 局外人

    A 小y的考试

    元组组成的列表 s o r t sort sort。用个 l a m b d a lambda lambda即可。 按照长度排序:

    如果最大的和次大的不相等,那么输出最大的。如果最小的和次小的不相等,那么输出最小的。否则输出 C C Cfor _ in range(int(input())): a=input() b=input() c=input() d=input() lst=[(len(a),"A"),(len(b),"B"),(len(c),"C"),(len(d),"D")] lst.sort(key=lambda x:x[0]) if lst[0][0]!=lst[1][0]: print(lst[0][1]) elif lst[3][0]!=lst[2][0]: print(lst[3][1]) else: print("C")

    B 小y的序列

    首先先把基本表打出来,从 1 1 1开始到 n n n 0 , 1 , 3 , 6 , 10 , 15 … … 0,1,3,6,10,15…… 0,1,3,6,10,15

    将输入的列表分别减去模板,差值作为下标利用 m a p map map进行自增,同一特质的序列差值都是一样的,所以看差值自增最多的,就是改最少的序列。

    #include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e8+10; ll n,b[N],x,ans; unordered_map <ll, ll> a; int main() { cin>>n; for(int i=1;i<=n;i++) b[i]=b[i-1]+i-1; for(int i=1;i<=n;i++){ cin>>x; a[x-b[i]]++; ans=max(ans,a[x-b[i]]); } cout<<n-ans<<endl; }

    C 小y的旅行

    先把两个都是 > k \gt k >k的边用并查集连起来,再把含有 k ≤ k\le k的边进行判断,如果这俩本身连起来了,那么这俩就得拆开, a n s + + ans++ ans++。如果没有连起来,就让他们连起来。

    #include<bits/stdc++.h> using namespace std; const int N=2e6+10; int n,m,k,ans; int fa[N],a[N],b[N]; inline void finit () { for(int i=1;i<=n;i++) fa[i]=i; } inline int find(int x) { if(fa[x] == x) return x; return fa[x] = find(fa[x]); } inline void join(int a,int b) { int a1=find(a),b1=find(b); if(a1!=b1) fa[a1]=b1; } int main() { cin>>n>>m>>k; finit(); for(int i=1;i<=m;i++){ cin>>a[i]>>b[i]; if(a[i]>k && b[i]>k) join(a[i],b[i]); } for(int i=1;i<=m;i++){ if(a[i]<=k || b[i]<=k){ int u=find(a[i]); int v=find(b[i]); if (u==v) ans++; fa[u]=v; } } cout<<ans<<endl; return 0; }

    完结。

    Processed: 0.011, SQL: 8