APAC Practice

2016 round A 

A. Googol String

small && large

LL a[65];
int dfs(LL pos, int id, bool f)
{
    if(pos==1 || pos==a[id-1]+1)
        return f? 0:1;
    if(pos>a[id-1])
        return dfs(a[id]-pos+1, id-1, f^1);
    else
        return dfs(pos, id-1, f);
}
int main()
{
    freopen("A-small-practice.in", "r", stdin);
    freopen("A.out", "w", stdout);
    a[1]=1;
    for(int i=2;i<=60;i++)
        a[i]=a[i-1]*2+1;
    int t, ca=1;
    scanf("%d", &t);
    while(t--)
    {
        LL n;
        scanf("%I64d", &n);
        int pos=lower_bound(a, a+61, n)-a;
        printf("Case #%d: %d\n", ca++, dfs(n, pos, 1));
    }
    return 0;
}

 

B. gCube

 

n个数,m个询问

 

每个询问给[l, r]

 

求 $\sqrt[^{r-l+1}]{\prod\limits_{i=l}^{r}a_i}$

 

smal

 

暴力二分,large TLE了 跑10min都没跑完,应该是大数乘太费时间

 

public class Main
{
    static BigDecimal quick(BigDecimal a, BigInteger b)
    {
        BigDecimal ans=BigDecimal.ONE;
        while(b.compareTo(BigInteger.ZERO)!=0)
        {
            if(b.mod(BigInteger.valueOf(2)).compareTo(BigInteger.ZERO)!=0)
                ans=ans.multiply(a);
            b=b.divide(BigInteger.valueOf(2));
            a=a.multiply(a);
        }
        return ans;
    }
    static BigDecimal sqrt(BigDecimal x, int n)
    {
        BigDecimal l=BigDecimal.ZERO, r=x;
        while(r.subtract(l).abs().compareTo(BigDecimal.valueOf(1e-10))>0)
        {
            BigDecimal m=(l.add(r)).divide(BigDecimal.valueOf(2));
            BigDecimal cur=quick(m, BigInteger.valueOf(n));
            cur=cur.subtract(x);
            if(cur.abs().compareTo(BigDecimal.valueOf(1e-10))<0)
                return m;
            else if(cur.compareTo(BigDecimal.ZERO)<0)
                l=m;
            else 
                r=m;
        }
        return l;
    }
    public static void main(String[] args) throws FileNotFoundException 
    {
//        InputReader in=new InputReader();
//        PrintWriter out=new PrintWriter(System.out);
        Scanner in=new Scanner(new File("B-large-practice.in"));
        PrintWriter out = new PrintWriter(new File("B.out"));
        int t=in.nextInt();
        int ca=1;
        while((t--)!=0)
        {
            int n=in.nextInt();
            int m=in.nextInt();
            int []a=new int[n];
            for(int i=0;i<n;i++)
                a[i]=in.nextInt();
            BigDecimal []b=new BigDecimal[n];
            b[0]=BigDecimal.valueOf(a[0]);
            for(int i=1;i<n;i++)
                b[i]=b[i-1].multiply(BigDecimal.valueOf(a[i]));
            out.println("Case #"+ca+":");ca++;
            while((m--)!=0)
            {
                int l=in.nextInt();
                int r=in.nextInt();
                BigDecimal pre=BigDecimal.ONE;
                if(l!=0) pre=b[l-1];
                BigDecimal s=b[r].divide(pre);
                out.printf("%.9f", sqrt(s, r-l+1));
                out.println("");
            }
        }
        out.close();
    }
}

 

large

 

求n次根号下的就是把ans除n次刚好除完

 

那就for l 到 r 每次都除一个ans 最后与1比较 判断是否除完就行了

 

const LD eps=1e-10; // eps<1e9了要long double!!!

int a[1005];
LD sqrtn(int x, int y)
{
    LD l=1, r=a[y];
    for(int i=x;i<=y;i++)     // 数列不递增!!注意取最大值!
        r=max(r, (LD)a[i]);
    while(fabs(l-r)>eps)
    {
        LD mid=(l+r)/2.0;
        LD cur=1.0;
        for(int i=x;i<=y;i++)
            cur*=a[i]/mid;
    // 要注意这里不能fabs(cur-1)<eps了就结束 因为cur与1<eps了 不代表mid与ans的误差也小于eps了!! if(cur>1) l=mid; else r=mid; } return l; } int main() { freopen("B-large-practice.in", "r", stdin); freopen("B.out", "w", stdout); int t, ca=1; scanf("%d", &t); while(t--) { int n, m; scanf("%d%d", &n, &m); for(int i=0;i<n;i++) scanf("%d", &a[i]); printf("Case #%d:\n", ca++); while(m--) { int l, r; scanf("%d%d", &l, &r); printf("%.9Lf\n", sqrtn(l, r)); } } return 0; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2017 round A

A. Country Leader

给n个字符串 输出其中字母最多的字符串 字母一样多 输出字典序最小

神tm 空格only appear in Large!! 挂了A large真是日了狗的心情

 1 char s[25];
 2 bool vis[1005];
 3 int main()
 4 {
 5     freopen("A-large-practice.in", "r", stdin);
 6     freopen("A.out", "w", stdout);
 7     int t, ca=1;
 8     scanf("%d", &t);
 9     while(t--)
10     {
11         printf("Case #%d: ", ca++);
12         int n;
13         scanf("%d", &n);
14         getchar();
15         string ans="";
16         int maxn=0;
17         for(int i=0;i<n;i++)
18         {
19             gets(s);
20             string ss=s;
21             memset(vis, 0, sizeof(vis));
22             int num=0;
23             int len=strlen(s);
24             for(int j=0;j<len;j++)
25                 if(s[j]!=' ' && !vis[s[j]])
26                     num++, vis[s[j]]=1;
27             if(num>maxn)
28                 maxn=num, ans=s;
29             else if(num==maxn)
30                 if(ss<ans)
31                     ans=ss;
32         }
33         cout<<ans<<endl;
34     }
35     return 0;
36 }
A

 

B. Rain


给n*m的方格,每个格子有高度,水满了会增加格子高度,输出增加的高度

每个格子会变成 上下左右 比它高的 最小高度

从最小的高度开始 看每格能否合法的变成这个高度

 1 vector<int> v;
 2 int mp[55][55];
 3 bool vis[55][55];
 4 int ans, n, m;
 5 bool can(int x, int y, int val)
 6 {
 7 //    int num=0;
 8     if(!vis[x][y] && mp[x][y]==val)
 9     {
10         if(x==0 || x==n-1 || y==0 || y==m-1)
11             return false;
12         vis[x][y]=1;
13 //        num=1;
14         if(x>0){
15             if(!can(x-1, y, val)) return false;}
16         if(x<n-1){
17             if(!can(x+1, y, val)) return false;}
18         if(y>0){
19             if(!can(x, y-1, val)) return false;}
20         if(y<m-1){
21             if(!can(x, y+1, val)) return false;}
22     }
23     else if(mp[x][y]<val)
24         return false;
25     return true;
26 }
27 void dfs(int x, int y, int num)
28 {
29     for(int i=0;i<n;i++)
30         for(int j=0;j<m;j++)
31             if(vis[i][j])
32                 ans+=num-mp[i][j], mp[i][j]=num, vis[i][j]=0;
33 }
34 int main()
35 {
36     freopen("B-large.in", "r", stdin);
37     freopen("B.out", "w", stdout);
38     int t, ca=1;
39     scanf("%d", &t);
40     while(t--)
41     {
42         printf("Case #%d: ", ca++);
43         scanf("%d%d", &n, &m);
44         v.clear();
45         for(int i=0;i<n;i++)
46             for(int j=0;j<m;j++)
47                 scanf("%d", &mp[i][j]), v.push_back(mp[i][j]);
48         sort(v.begin(), v.end());
49         int d=unique(v.begin(), v.end())-v.begin();
50         if(d<2)
51         {
52             puts("0");
53             continue;
54         }
55         ans=0;
56         for(int ii=1;ii<d;ii++)
57         {
58             for(int i=0;i<n;i++)
59             {
60                 for(int j=0;j<m;j++)
61                 {
62                     memset(vis, 0, sizeof(vis));
63                     if(mp[i][j]<v[ii] && can(i, j, mp[i][j]))
64                     {
65                         dfs(i, j, v[ii]);
66                     }
67                 }
68             }
69         }
70 //        for(int i=0;i<n;i++){
71 //            for(int j=0;j<m;j++)
72 //                printf("%d ", mp[i][j]);puts("");}
73         printf("%d\n", ans);
74     }
75     return 0;
76 }
B

 

C. Jane's Flower Shop

给n个系数 求一元n次方程在-1到1之间的那个解,题目保证有且仅有一解

因为保证有且仅有一解,因此Left和Right两端一定为一正一负

根据正负二分就行

 1 typedef long double LD;
 2 const LD eps=1e-10;
 3 
 4 int a[105];
 5 int n;
 6 LD cal(LD r)
 7 {
 8     LD cur=1, ans=0;
 9     for(int i=0;i<=n;i++, cur*=(1+r))
10         ans+=a[n-i]*cur;
11     return ans;
12 }
13 int main()
14 {
15     freopen("C-large.in", "r", stdin);
16     freopen("C.out", "w", stdout);
17     int t, ca=1;
18     scanf("%d", &t);
19     while(t--)
20     {
21         printf("Case #%d: ", ca++);
22         scanf("%d", &n);
23             for(int i=0;i<=n;i++)
24                 scanf("%d", &a[i]);
25             a[0]=-a[0];
26             LD l=-1, r=1;
27             LD ll=cal(l), rr=cal(r);
28             while(fabs(l-r)>eps)
29             {
30                 LD m=(r+l)*0.5;
31                 LD mm=cal(m);
32                 if(mm<0 && ll<0)
33                     l=m;
34                 else if(mm<0 && rr<0)
35                     r=m;
36                 else if(mm>0 && ll>0)
37                     l=m;
38                 else if(mm>0 && rr>0)
39                     r=m;
40                 else
41                     l=m;
42             }
43             printf("%.12Lf\n", l);
44     }
45     return 0;
46 }
C

 

posted @ 2016-07-03 12:07  Empress  阅读(170)  评论(0编辑  收藏  举报