A. Pretty Permutations
题意:给你1,2,3,。。。n.让你输出一个排列,使其每一个数都不能在原来的位置上并且每个数移动的距离之和要最小。
例如1234变成2143为最小,但是4123则不是
思路:一开始想错了,直接看样例把最后一个提取到了第一个位置输出.2分钟就WA了一发。。
其实应该两两交换,碰到奇数就把最后三个进行交换就可以了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
if(n%2==0)
{
for(int i=1;i<=n;i+=2)
{
cout<<i+1<<" "<<i<<" ";
}
}
else
{
for(int i=1;i<=n-4 ;i+=2)
{
cout<<i+1<<" "<<i<<" ";
}
cout<<n<<" "<<n-2<<" "<<n-1;
}
cout<<endl;
}
}
B. Pleasant Pairs
题意:给你一串不相同的数字:让你找出这样的排列有几对:
a[i]*a[j]=i+j
,当然要满足i<j
;
思路:一开始想着有没有捷径,然后发现没有。。只能暴力去做。但是直接暴力就会超时,学长给了做法(),对于每个a[i]都会有一个i和其对应,然后只需要找到第一个j,然后给其每次增加a[i]就可以了;
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,ans=0,a[100009];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=a[i]-i;j<=n;j+=a[i])
{
if(j>i&&(a[i]*a[j]==i+j))
{
ans++;
}
}
}
cout<<ans<<endl;
}
}
C. Great Graphs
题意:
有n个点,两两之间是可以有一条路的,每条路有一个权值,要求不能有负权值的环
思路:
对点坐标进行排序,计算每一段出现多少次,例如1,2,3,4四个点
2->1,3->1,4->1;
3->2,4->2;
4->3;
算出总和减掉a[i]之和就行了
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll t;
cin>>t;
while(t--)
{
ll n,a[100009];
cin>>n;
ll ans=0;
for (int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for (int i=1;i<=n;i++)
ans-=(a[i]-a[i-1])*(n-i+1)*(i-1);
ans+=a[n];
cout<<ans<<endl;
}
}
一点吐槽
这场真的阴间,最后D过了17个,E过了一个还是三个人,难度安排不合理(确信)