HDU 5014 Number Sequence(貪心),hdu5014

來源:互聯網
上載者:User

HDU 5014 Number Sequence(貪心),hdu5014

當時想到了貪心,但是不知為何舉出了反列。。。。我是逗比,看了點擊開啟連結。才發現我是逗比。

Problem DescriptionThere is a special number sequence which has n+1 integers. For each number in sequence, we have two rules:

● ai ∈ [0,n] 
● ai ≠ aj( i ≠ j )

For sequence a and sequence b, the integrating degree t is defined as follows(“⊕” denotes exclusive or):

t = (a0 ⊕ b0) + (a1 ⊕ b1) +···+ (an ⊕ bn)

(sequence B should also satisfy the rules described above)

Now give you a number n and the sequence a. You should calculate the maximum integrating degree t and print the sequence b.
 
InputThere are multiple test cases. Please process till EOF. 

For each case, the first line contains an integer n(1 ≤ n ≤ 105), The second line contains a0,a1,a2,...,an.
 
OutputFor each case, output two lines.The first line contains the maximum integrating degree t. The second line contains n+1 integers b0,b1,b2,...,bn. There is exactly one space between bi and bi+1 (0 ≤ i ≤ n - 1). Don’t ouput any spaces after bn.
 
Sample Input
42 0 1 4 3
 
Sample Output
201 0 2 3 4
 
Source2014 ACM/ICPC Asia Regional Xi'an Online
枚舉貪心即可。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<map>using namespace std;typedef long long LL;const int maxn=1e5+100;LL a[maxn];LL d[maxn];int main(){    LL n;    while(~scanf("%I64d",&n))    {        for(LL i=0;i<=n;i++)            scanf("%I64d",&a[i]);        memset(d,-1,sizeof(d));        LL ans=0;        for(LL i=n;i>=0;i--)        {            LL t=0;            if(d[i]==-1)            {                for(LL j=0;;j++)                {                    if(!(i&(1<<j)))  t+=(1<<j);                    if(t>=i)                    {                        t-=(1<<j);                        break;                    }                }                ans+=(i^t)*2;                d[i]=t;                d[t]=i;            }        }        printf("%I64d\n",ans);        for(LL i=0;i<=n;i++)        printf(i==n?"%I64d\n":"%I64d ",d[a[i]]);    }    return 0;}



number sequence

計算有時間限制 2000/1000 毫秒
1 <= n <= 100,000,000
當 n 很大的時候 會逾時。

這部分程式利用周期性,提前結束運算。
f[i] = () mod 7 的結果只能是 0,1,2,3,4,5,6

r[8][8] 數組格子裡放 {f[i-1],f[i-2]} 時的 f[i]
遇到同一格子裡有數時,就是一個周期性。
有了周期,可以計算到達 n時 它剛好是周期開始的那幾個數。就是結果。周期必小於 8*8.
 
杭電ACM1005 Number Sequence

/*
1 1 3
2
1 2 10
5
0 0 0
Press any key to continue
*/
#include<stdio.h>int main(void) {int a1 = 1,a2 = 1,an;int A,B,n,i;while(1) {scanf("%d%d%d",&A,&B,&n);if(A == 0 && B == 0 && n == 0) break;a1 = 1;a2 = 1;for(i = 3; i <= n; ++i) {an = (A * a2 + B * a1) % 7;a1 = a2;a2 = an;}printf("%d\n",an);}return 0;}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.