Codeforces Round #728 (Div. 2) A-C

题目地址

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过了一个还是三个人,难度安排不合理(确信)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值