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 }