5734 Acperience
水题.. 队友写的C++数据溢出了,于是改成java水过。
import java.io.*;
import java.math.*;
import java.util.*;
public class Main
{
static BigInteger[] a=new BigInteger[100020];
public static void main(String[] args)throws IOException
{
Main ma=new Main();
ma.solve();
}
public void solve()throws IOException
{
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
st.nextToken(); //输入前记得加
int t=(int)st.nval;
while(true)
{
if(t==0) break;
st.nextToken();
int n=(int)st.nval;
BigInteger sum=BigInteger.ZERO;
int num=0;
for(int i=0;i<n;i++)
{
st.nextToken();
long x=(long)st.nval;
a[i] =BigInteger.valueOf(x);
a[i]=a[i].abs();
if(i>0&&a[i].compareTo(a[i-1])!=0)
num=1;
sum=sum.add(a[i]);
}
if(num==0)
{
out.println("0/1");
t--;
continue;
}
BigInteger fe,mu,fe1,mu1;
fe=sum;
mu=BigInteger.valueOf(n);
fe1=BigInteger.ZERO;
mu1=BigInteger.valueOf(n).multiply(BigInteger.valueOf(n));
for(int i=0;i<n;i++)
{
BigInteger tmp=a[i].multiply(mu);
tmp=tmp.subtract(fe);
tmp=tmp.multiply(tmp);
fe1=fe1.add(tmp);
}
BigInteger g=fe1.gcd(mu1);
fe1=fe1.divide(g);
mu1=mu1.divide(g);
if(fe1.compareTo(BigInteger.ZERO)==0)
{
mu1=BigInteger.ONE;
}
out.println(fe1+"/"+mu1);
t--;
}
out.close();
}
}
5735 Born Slippy
待补...5736 Call It What You Want
待补...Differencia
待补...
Eureka
要求找一些点集,满足每个集合中,存在至少一个点对(u,v),让集合中任何一点w,满足g(u,v,w) >= f(u,v)
化简为 f(u,v) >= f(v,w)+f(w,u) ,可知大于号是无法满足的,即w在u,v线段上。
这样要找的集合其实是一条线段,点对u,v其实就是线段两个端点。
待补...
Fantasia
待补...
Glorious Brilliance
待补...
Helter Skelter
待补...
It's All In The Mind
水题,
令
x=a1+a2,y=a3+a4+⋯+an
, 那么
a1+a2+⋯+ana1+a2=x+yx=1−x+yy
. 对于定值
y
, 显然
x
越大越好, 对于定值
x
, 显然
y
越小越好. 于是按照
a1
和
a2
尽量大, 其他元素尽量小的策略填数就好了.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define ll long long
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
using namespace std;
int a[105];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
a[i]=-1;
for(int i=0;i<m;i++)
{
int id,v;
cin>>id>>v;
a[id]=v;
}
int tmp=0;
for(int i=n;i>=3;i--)
{
if(a[i]==-1)
a[i]=tmp;
else
tmp=a[i];
}
if(a[2]==-1&&a[1]==-1)
a[1]=a[2]=100;
else if(a[2]==-1&&a[1]!=-1)
a[2]=a[1];
else if(a[2]!=-1&&a[1]==-1)
a[1]=100;
int sum=a[1]+a[2];
for(int i=n;i>=3;i--)
sum+=a[i];
int g=__gcd(a[1]+a[2],sum);
int tt=(a[1]+a[2])/g;
sum/=g;
printf("%d/%d\n",tt,sum);
}
}
Join The Future
待补...
Keep On Movin
水题, 如果每个字符出现次数都是偶数, 那么答案显然就是所有数的和. 对于奇数部分, 显然需要把其他字符均匀分配给这写奇数字符.#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<vector>
#include<map>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define lowbit(x) x&(-x)
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int a[100005],xx=0,sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
xx+=a[i]%2;
sum+=a[i];
}
if(xx==0||xx==1)
{
printf("%d\n",sum);
}
else
{
printf("%d\n",1+(sum-xx)/(2*xx)*2);
}
}
}
La Vie en rose
题解上貌似很麻烦,可以直接暴力水过...
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int max_n = 100005;
int main()
{
int t, n,m;
int i,j;
char s1[100005],s2[5005];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
scanf("%s",s1);
scanf("%s",s2);
for(i=0;i<n-m+1;i++)
{
int flag=0;
for(j=0;j<m;j++)
{
if(s2[j]==s1[i+j])
continue;
if(s1[i+j]==s2[j+1]&&s1[i+j+1]==s2[j])
{
j++;
continue;
}
else
{
flag=1;
break;
}
}
if(flag)
printf("0");
else
printf("1");
}
for(i=0;i<m-1;i++)
printf("0");
printf("\n");
}
}
Memento Mori
待补...
(xu−xv)2+(yu−yv)2‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾√
即为u,v两点距离