HDU 5014 Number Sequence (Greedy), hdu5014
At that time, I thought of greed, but I don't know why I cited the anti-column .... I clicked to open the link. I found out that I am a funny girl.
Problem DescriptionThere is a special number sequence which has n + 1 integers. For each number in sequence, we have two rules:
● Ai in [0, n]
● Ai = aj (I = j)
For sequence a and sequence B, the integrating degree t is defined as follows ("writable" denotes exclusive or ):
T = (a0 rjb0) + (a1 rjb1) + · + (an 1_bn)
(Sequence B shoshould also satisfy the rules described abve)
Now give you a number n and the sequence a. You shoshould 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,...,.
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
Enumerate greedy.
#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
Computing time limit: 2000/1000 Ms
1 <= n <= 100,000,000
When n is large, it times out.
This part of the program uses periodicity to end the operation ahead of schedule.
F [I] = () mod 7 can only be 0, 1, 2, 3, 4, 5, 6
R [8] [8] Put in the array Lattice f [I-1], f [I-2]} f [I]
When there is a number in the same grid, it is a periodicity.
With a period, you can calculate the number that is equal to the start of the period when n is reached. Is the result. The period must be less than 8*8.
Hangdian 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", & 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 ;}