Codeforces Round #728 (Div. 2)a-c

比眉伴天荒 2022-10-10 04:48 159阅读 0赞

https://codeforc.es/contest/1541

cf

  • a
  • b
  • c

#

a

给定一个数n,1 2 3 4 … n 每个数不在原位,求最小移动次数,对应的序列
分别讨论n为偶数和奇数的情况

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int t, n;
  6. scanf("%d", &t);
  7. while(t--){
  8. scanf("%d", &n);
  9. if(n%2==0) for (int i = 2; i <= n; i+=2)
  10. {
  11. printf("%d %d ",i,i-1);
  12. }else{
  13. int a[105];
  14. for(int i =1; i <= n; i++) a[i] = i;
  15. for (int i = 1; i <= n; i+=2){
  16. if(i+2==n) {
  17. printf("%d %d %d",a[i+2],a[i],a[i+1]);break;
  18. }
  19. else printf("%d %d ",a[i+1],a[i]);
  20. }
  21. }
  22. printf("\n");
  23. }
  24. return 0;
  25. }

b

给定一个长为n的序列,满足
i < j i < j i n j > n j>n 和 i > = j i >= j i>=j位置剪枝掉
注意两个数的大小是 1 0 5 10^5 105乘的时候要扩展一下范围

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. int main()
  5. {
  6. int t; scanf("%d",&t);
  7. while(t--)
  8. {
  9. int n; scanf("%d",&n);
  10. int a[n+10];
  11. for(int i =1; i <= n; i++) scanf("%d",&a[i]);
  12. int ans = 0;
  13. for(int i =1; i <= n; i++)
  14. {
  15. int tmp = 1;
  16. while(1){
  17. int x = tmp * a[i];
  18. int j = x - i;
  19. if(j > n) break;
  20. if(j > i && (ll)a[i]*a[j] == (ll)(i+j)) ans++;
  21. tmp++;
  22. }
  23. }
  24. printf("%d\n",ans);
  25. }
  26. }

c

权值最小,建立一个正向边,建立尽可能多的反向边。
正向边最小的长度: a r r [ n − 1 ] arr[n-1] arr[n−1]
反向边:在这里插入图片描述

orz的代码,截过来了:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define all(x) (x).begin(), (x).end()
  4. typedef long long ll;
  5. typedef vector<ll> vl;
  6. void solve()
  7. {
  8. ll n; scanf("%lld",&n);
  9. vl arr(n);
  10. for(int i = 0;i<n;i++) cin >> arr[i];
  11. sort(all(arr));
  12. ll ans = arr[n-1];
  13. vl neg(n);
  14. neg[0] = 0;
  15. for(int i = 1;i<n;i++){
  16. neg[i] = neg[i-1] + i*(arr[i] - arr[i-1]);
  17. ans -= neg[i];
  18. }
  19. printf("%lld\n", ans);
  20. }
  21. int main(){
  22. int t = 1;
  23. cin >> t;
  24. while(t--)
  25. solve();
  26. return 0;
  27. }

用前缀和处理也可以

发表评论

表情:
评论列表 (有 0 条评论,159人围观)

还没有评论,来说两句吧...

相关阅读

    相关 codeforces-round375-div2

    题目链接:[codeforces round 375 div2][] A题: 读一遍题目就知道是超级水的题目,,就是给你三个坐标,求三个坐标汇集到一个点所走的路程