参赛地址:
第 5 场 小白入门赛 - 蓝桥云课 (lanqiao.cn)
题目列表:
第一题:是签到题,就不需要解释了
第二题:欢迎参加福建省大学生程序设计竞赛(题目)
主要思路:
就是分类,就是看有多少组,主要用到哈希表,以int为键(a),后面设个动态数组,存放不同的b
如果b在这个数组里能找到,结果不加1,否则,结果加1,加入数组。
#include <iostream>
using namespace std;
#include<map>
#include<vector>
#include<algorithm>
int main()
{
int Q;
cin>>Q;
int a,b;
int cnvt=0;
map<int,vector<int>>h;
while(Q--){
cin>>a>>b;
if(h[a].size()==0) cnvt++,h[a].push_back(b);
else{
if (find(h[a].begin(), h[a].end(), b) != h[a].end()){
}
else{
cnvt++;
h[a].push_back(b);
}
}
}
cout<<cnvt;
// 请在此输入您的代码
return 0;
}
第三题:匹配二元组的数量【算法赛】
主要思路:
主要就该公式化简,得出 i*ai=j*aj 所以得出判断满足二元组的条件,就是下标与其对应数组的值,因为这个值只和数组的一个状态有关,我们在输入的时候立马改变就可以i*ai
这里要注意一点,要注意到你数组是从0开始储存,还是从1开储存
然后开辟一个数组在存储所有出现的整数(不存在重复),再用哈希表去放置对应的次数
因为是二元组,两两组队,所以每一个的次数为n*(n-1)/2
代码:
#include <iostream>
#include<vector>
#include<map>
using namespace std;
int main()
{
int n;
cin>>n;
int i,j;
long long arr[n];
vector<long long >l;
map<long ,long >h;
for(i=0;i<n;i++){
cin>>arr[i];
arr[i]=arr[i]*(i+1);
h[arr[i]]++;
if(h[arr[i]]==1){
l.push_back(arr[i]);
}
}
// i*ai ==j*aj
long long cnvt=0;
for(auto s:l ){
cnvt+=h[s]*(h[s]-1)/2;
}
cout<<cnvt;
return 0;
}
第四题:元素交换【算法赛】
代码:
#include <iostream>
using namespace std;
int a[200010];
int main()
{
int n,t1=0,t2=0;
cin>>n;
for(int i=0;i<2*n;i++){
cin>>a[i];
if(a[i]==i%2) t1++;
else t2++;
}
cout<<min(t1/2,t2/2);
return 0;
}
第五题:
代码:这个不是本人,本人有点了解不了
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,ans=0;
cin>>n;
long long t=floor(sqrt(n)),tt=n-t*t;
ans=(t-2)*(t-2)*4+4*(t-2)*3+4*2;
if(tt>0){
ans+=2;
tt--;
ans+=min(tt,t-1)*4;
tt-=t-1;
}
if(tt>0){
ans+=2;
tt--;
ans+=min(tt,t)*4;
tt-=t;
}
if(tt>0){
ans+=2;
tt--;
ans+=min(tt,t)*4;
tt-=t;
}
if(tt>0){
ans+=2;
tt--;
ans+=min(tt,t+1)*4;
tt-=t+1;
}
cout<<ans;
return 0;
}