• Codeforces Round #525 (Div. 2)C


    题目

    题意:

      给你长度为n的数组a[i],最多操作n+1次,每次都可以将前 i 个数  (操作1)都加上x,或者(操作2)都%x ,(x为1e6以内的任意数,且每次操作可以不同), 使得数组a严格单调递增(一定后一项大于前一项)。  要你输出一个总的操作次数,再以 1 i x 或者 2 i x 的形式输出每次操作,其中 1和2是哪种操作,i 是前i个 。 如果不需要操作,输出0即可。

    思路:

      每个a[i]都加上一个巨大的数num,a[ i ] += num ; 然后每一个a[i] 都 a[i] = a[i] % (a[i] - i ),(i从1到n),这样就可以肯定地得到a[1]=1, a[2]=2, ....a[n]=n, 且总的操作次数正好 =n+1 。

      n=1时,不用特判。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include <cctype>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cmath>
     7 #include<string>
     8 #include<cmath>
     9 #include<set>
    10 #include<vector>
    11 #include<stack>
    12 #include<queue>
    13 #include<map>
    14 using namespace std;
    15 #define ll long long
    16 #define mem(a,x) memset(a,x,sizeof(a))
    17 #define se second
    18 #define fi first
    19 const ll mod=1e9+7;
    20 const int INF= 0x3f3f3f3f;
    21 const int N=3e5;
    22 
    23 int n;
    24 int a[2005];
    25 
    26 int main()
    27 {
    28     cin>>n;
    29     for(int i=1;i<=n;i++)
    30     {
    31         scanf("%d",&a[i]);
    32         a[i]+=N;
    33     }
    34     cout<<n+1<<endl;
    35     printf("1 %d %d
    ",n,N);
    36     for(int i=1;i<=n;i++)
    37     {
    38         printf("2 %d %d
    ",i,a[i]-i);
    39     }
    40 }
    View Code
  • 相关阅读:
    sequence——强行推式子+组合意义
    2018-2-25-git-rebase-合并多个提交
    2018-2-25-git-rebase-合并多个提交
    2019-9-2-给博客添加rss订阅
    2019-9-2-给博客添加rss订阅
    2019-10-31-Resharper-去掉注释拼写
    2019-10-31-Resharper-去掉注释拼写
    2018-8-10-win10-sdk-是否向下兼容
    2018-8-10-win10-sdk-是否向下兼容
    2019-8-15-win10-edge-打开闪退问题
  • 原文地址:https://www.cnblogs.com/thunder-110/p/10116122.html
Copyright © 2020-2023  润新知