This is my code. I think it's O(N), please tell me if I am wrong.

T = gets.to_i
T.times do |i|
  r, k, n = gets.split.map{|l| l.to_i}
  g = gets.split.map{|l| l.to_i}
  gi = g.clone
  gt = gi.clone
  gs = [] << gi.clone
  sa = []
  s = 0
  ri = 1
  while ri <= r
    ss = 0
    gi.each do |j|
      if k >= ss + j
        ss += j
        gt << gt.shift
      else
        break
      end
    end
    sa << ss
    s += ss
    gi = gt.clone
    if gs.include?(gi)
      gind = gs.find_index(gi)
      sloop = 0
      gind.upto(gs.length-1) {|gival| sloop += sa[gival]}
      rr = (r - gind)/(ri - gind) - 1
      ri += (ri - gind)*rr
      sloop *= rr
      s += sloop
      gs.clear
      sa.clear
    else
      gs << gi.clone
    end
    ri += 1
  end
  puts "Case ##{i+1}: #{s}"
end


On Mon, May 10, 2010 at 18:17, Liu Cheng <[email protected]> wrote:

> I used the O(n) solution in the contest.
> You can see my code.
> #include <iostream>
> #include <cstdio>
> #include <cstring>
> #include <algorithm>
> using namespace std;
>
> int g[1024];
> int f[1024];
> long long c[1024];
>
> int main() {
>        freopen("park.in", "r", stdin);
>        freopen("park.out", "w", stdout);
>        int T, tc = 0;
>        scanf("%d", &T);
>        while (T -- > 0) {
>                int r, k, n;
>                long long ans = 0;
>                memset(f, 255, sizeof(f));
>                memset(c, 0, sizeof(c));
>                scanf("%d%d%d",&r,&k,&n);
>                for (int i = 0; i < n; ++i) {
>                        scanf("%d", g+i);
>                }
>                int pos = 0;
>                int t = 0;
>                while (1) {
>                        if (t >= r) break;
>                        if (f[pos] == -1) {
>                                int oldpos = pos;
>                                long long oldans = ans;
>                                int oldt = t ++;
>                                int remain = k;
>                                while (g[pos] <= remain) {
>                                        remain -= g[pos];
>                                        ans += g[pos];
>                                        if (++pos == n) pos = 0;
>                                        if (pos == oldpos) break;
>                                }
>                                f[oldpos] = oldt;
>                                c[oldpos] = oldans;
>                        } else {
>                                int cnt = (r - t) / (t - f[pos]);
>                                ans += (ans - c[pos]) * cnt;
>                                t   += (t - f[pos]) * cnt;
>                                memset(f, 255, sizeof(f));
>                                memset(c, 0, sizeof(c));
>                        }
>                }
>
>                cout << "Case #" << ++tc <<": " << ans << endl;
>        }
>        return 0;
> }
>
>
> On Mon, May 10, 2010 at 8:40 PM, Dario <[email protected]> wrote:
> > @Mikhail: True, I didn't think about the O(N^2) part in the beginning.
> > That means that there's no real advantage in using this over some
> > O(N^2) solution. My original thinking was that lg R < 30 << 1000 so
> > this might beat the O(N^2) approach.
> >
> > On May 10, 2:32 pm, Dario <[email protected]> wrote:
> >> How exactly would the O(N) solution work?
> >>
> >> On May 9, 9:23 pm, hamzawy <[email protected]> wrote:
> >>
> >>
> >>
> >> > Why not to solve it in O(N) (such that N is the number of the group)??
> >>
> >> > On May 9, 5:42 pm, Dario <[email protected]> wrote:
> >>
> >> > > I just made the large input case for problem C by storing 'next
> >> > > position' and 'cash' arrays, then just iterating over them R times.
> >> > > This seems to be O(N+R). But I've been wondering about possible
> >> > > optimizations to this. I can think of an O(NlogR) solution in which
> I
> >> > > nest the 'next position' and 'cash' arrays, only adding up cash/
> >> > > changing position when the correct bit of R is on (binary). I've
> >> > > pasted my code below (the algorithm described here is really just
> the
> >> > > solve() function and the rest is wrapping). I'd be interested in a
> >> > > comparison of different optimizations/algorithms over the problem
> >> > > space?
> >>
> >> > > def doProb(fname, ofname):
> >> > >     #do problem 3 given a file name
> >> > >     f = open(fname, 'r');
> >> > >     T = int(f.readline());
> >> > >     output = ['Case #' + str(i) + ': '+ \
> >> > >                 str(solve([int(j) for j in f.readline().split()],
> >> > > [int(j) for j in f.readline().split()])) + \
> >> > >                 '\n' for i in range(1,T+1)];
> >> > >     f.close();
> >> > >     of = open(ofname, 'w');
> >> > >     of.writelines(output);
> >> > >     of.close();
> >>
> >> > > def solve(x,g):
> >> > >     (R,k,N) = x; #unpack the input
> >> > >     (np, cash) = getParms(k,g);
> >> > >     cur = 0;
> >> > >     tot = 0;
> >>
> >> > >     while(R>0):
> >> > >         incl = R%2;
> >> > >         R = R//2;
> >> > >         if(incl==1):
> >> > >             tot += cash[cur];
> >> > >             cur = np[cur];
> >> > >         (np, cash) = nest(np, cash);
> >> > >     return tot;
> >>
> >> > > def nest(np, cash):
> >> > >     #thinking of np as a permutation, get np^2 and total cash list
> >> > >     np2 = [0]*len(np);
> >> > >     c2  = [0]*len(np);
> >> > >     for i in range(len(np)):
> >> > >         np2[i] = np[np[i]];
> >> > >         c2[i] = cash[i]+cash[np[i]];
> >> > >     return (np2, c2);
> >>
> >> > > def getParms(k,g):
> >> > >     N= len(g);
> >>
> >> > >     #special case, all passengers fit in the roller coaster:
> >> > >     if(sum(g) <= k):
> >> > >         np = [i for i in range(N)];
> >> > >         cash = [sum(g)]*N;
> >> > >         return (np, cash);
> >>
> >> > >     #other cases
> >> > >     np = [];
> >> > >     cash = [];
> >> > >     for i in range(N):
> >> > >         tot = g[i];
> >> > >         j = i;
> >> > >         while(tot <= k):
> >> > >             j = (j+1)%N;
> >> > >             tot += g[j];
> >> > >         tot -= g[j];
> >> > >         np.append(j);
> >> > >         cash.append(tot);
> >>
> >> > >     return (np, cash);
> >>
> >> > > --
> >> > > You received this message because you are subscribed to the Google
> Groups "google-codejam" group.
> >> > > To post to this group, send email to [email protected].
> >> > > To unsubscribe from this group, send email to
> [email protected]<google-code%[email protected]>
> .
> >> > > For more options, visit this group athttp://
> groups.google.com/group/google-code?hl=en.
> >>
> >> > --
> >> > You received this message because you are subscribed to the Google
> Groups "google-codejam" group.
> >> > To post to this group, send email to [email protected].
> >> > To unsubscribe from this group, send email to
> [email protected]<google-code%[email protected]>
> .
> >> > For more options, visit this group athttp://
> groups.google.com/group/google-code?hl=en.
> >>
> >> --
> >> You received this message because you are subscribed to the Google
> Groups "google-codejam" group.
> >> To post to this group, send email to [email protected].
> >> To unsubscribe from this group, send email to
> [email protected]<google-code%[email protected]>
> .
> >> For more options, visit this group athttp://
> groups.google.com/group/google-code?hl=en.
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> "google-codejam" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> [email protected]<google-code%[email protected]>
> .
> > For more options, visit this group at
> http://groups.google.com/group/google-code?hl=en.
> >
> >
>
> --
> You received this message because you are subscribed to the Google Groups
> "google-codejam" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-code%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-code?hl=en.
>
>


-- 

Thanks & Regards,
Dhruva Sagar.

-- 
You received this message because you are subscribed to the Google Groups 
"google-codejam" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-code?hl=en.

Reply via email to