小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;
}
京公网安备 11010502036488号