A题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll a,b;
cin>>a>>b;
ll res=0;
ll x=abs(a-b);
res+=x/5;
x%=5;
res+=x/2;
x%=2;
res+=x;
cout<<res<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
}
B题
- 题意
题面太吓人了,好长,可是题简单,就是给你n个点,让你构造m个边,使得每个顶点的度大于等于2,然后n==2时直接-1.so,很简单了,直接上代码。
- 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10010;
int a[N];
void solve()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
if(n==2)
{
puts("-1");
return;
}
if(n>m)
{
puts("-1");
}
else
{
int res=0;
for(int i=1;i<n;i++)
{
res+=(a[i]+a[i+1]);
}
res+=(a[1]+a[n]);
cout<<res<<endl;
for(int i=1;i<n;i++)
{
cout<<i<<" "<<i+1<<endl;
}
cout<<n<<" "<<1<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
}
C题
- 题意
求一个n全排列,使得满足条件。预先给你n-2列3个数,
你可以重新排列这些集合,也可以在这三个数的集合中重新排列。
- 思路
没有思路,还是直接看答案吧。
- 代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
bool vis[N];
vector<int> v[N];
void solve()
{
memset(vis,0,sizeof(vis));
int n;
cin>>n;
map<int,int> mp;
for(int i=1;i<=n-2;i++)
{
int a,b,c;
cin>>a>>b>>c;
v[a].push_back(b);
v[b].push_back(c);
v[a].push_back(c);
v[b].push_back(a);
v[c].push_back(b);
v[c].push_back(a);
mp[a]++,mp[b]++,mp[c]++;
}
int x,y,z;
for(int i=1;i<=n;i++)
{
if(mp[i]==1)
{
x=i;
break;
}
}
if(mp[v[x][1]]==2)
y=v[x][1];
else
y=v[x][0];
cout<<x<<" "<<y<<" ";
vis[x]=1,vis[y]=1;
for(int i=1;i<=n-2;i++)
{
for(auto item:v[x])
{
if(!vis[item])
{
z=item;
break;
}
}
cout<<z<<" ";
vis[z]=1;
x=y,y=z;
}
}
int main()
{
int t;
t=1;
while(t--)
{
solve();
}
}
优秀博文
优秀博文