2016 Multi-University Training Contest 2(补题ing)

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

水题, xa1a2ya3a4anx=a1+a2,y=a3+a4++an , 那么 a1a2a1a2anxxy1yxya1+a2++ana1+a2=x+yx=1x+yy . 对于定值 yy , 显然 xx 越大越好, 对于定值 xx , 显然 yy 越小越好. 于是按照 a1a1 a2a2 尽量大, 其他元素尽量小的策略填数就好了.
#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

待补...





(xuxv)2+(yuyv)2  即为u,v两点距离
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值