小y的考试

思路:我们先对四个选项进行一个排序,同时我们将排好序后的要能够保留到原始的选项号,根据“三长一短选最短”,我们判断有没有最短的那个选项,有就选对应的选项,然后根据“三短一长选最长”,我们可以找出是否有最长的,同理,如果两者都没有,那么直接输出C即可。

#include<bits/stdc++.h>
using namespace std;
string s[4];
struct node{
    int len;
    char ch;
}Node[4];
bool cmp(node a,node b){
    return a.len>b.len;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        for(int i=0;i<4;i++){
            cin>>s[i];
            Node[i].len=s[i].size();
            Node[i].ch='A'+i;
        }
        sort(Node,Node+4,cmp);
        if(Node[2].len!=Node[3].len){
            cout<<Node[3].ch<<endl;
        }
       else if(Node[0].len!=Node[1].len){
            cout<<Node[0].ch<<endl;
        }
        else  cout<<"C"<<endl;
    }
    return 0;
}

小y的序列

思路:首先,我们对于这个数组里面的每一项,我们可以求出原始的数组,我们发现,原始的数组和新数组直接的每项的差值是一样的,所以,我们可以根据差值来进行一个判断,我们找到每项相对于原始项的差值,然后计算出现次数最多的那个差值的出现次数,最后用n-这个次数就是我们要求的答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010],b[100010];
ll sum=0;
int main(){
    ll n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    ll ans=0;
    sum=1;
    map<ll,ll> mp;
    mp[a[1]-1]++;
    for(int i=2;i<=n;i++){
        sum+=(i-1);
        //cout<<sum<<endl;
        ll tmp=a[i]-sum;
        mp[tmp]++;
        ans=max(ans,mp[tmp]);
        //cout<<ans<<endl;
    }
    cout<<n-ans<<endl;
    return 0;
}

小y的旅行

思路:这个题目我们将这些边分为两种边,一种是边上的两个端点都大于k的话,那么我们就不要管这些点的情况,但是也要用并查集维护这些点的连通性,对于只要有一个端点小于等于k的情况,我们就要将他们列入考虑删除的范围内,然后,我们考虑那些边,如果这两条边没有联通的话,我们要将他们联通,否则,我们就要删除这一条边,可以证明,我们将联通的这条边删除的话不会影响最后的结果。可以维护他们不形成环。
代码:

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
#include<set>
#include<utility>
using namespace std;
typedef long long ll;
int fa[2000010];
vector<pair<int,int> > v;
int find(int x){
    if(fa[x]==x)  return x;
    return fa[x]=find(fa[x]);
}
int main(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) fa[i]=i;
    while(m--){
        int x,y;
        cin>>x>>y;
        if(x<=k||y<=k) v.push_back(make_pair(x,y));
        else{
            int fx=find(x),fy=find(y);
            fa[fx]=fy;
        }
    }
    int ans=0;
    int len=v.size();
    for(int i=0;i<len;i++){
        int fx=find(v[i].first),fy=find(v[i].second);
        if(fx==fy)  ans++;
        else  fa[fx]=fy;
    }
    cout<<ans<<endl;
    return 0;
}