2015年1月31日 星期六

[CF] Round #289

一個 div 2 限定的比賽,說規則是仿ACM的,所以可以直接看到自己這題對不對,沒有hack。
總之就隨便寫寫......只寫了 A B D E,F 還沒想,可能之後會補上,至於 C 我覺得好麻煩就怒跳過了XD

A :


#include<bits/stdc++.h>
using namespace std;
int d[20][20] ;
main()
{
    int n ; scanf("%d",&n) ;
    for(int i=1;i<=n;i++) d[i][1]=d[1][i]=1 ;
    for(int i=2;i<=n;i++) for(int j=2;j<=n;j++)
        d[i][j]=d[i-1][j]+d[i][j-1] ;
    printf("%d\n",d[n][n]) ;
}
 

B :

#include<bits/stdc++.h>
using namespace std;
int a[200],b[200] ;
main()
{
    int n,k ; scanf("%d%d",&n,&k) ;
    int M=-1,m=101 ;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]) , m=min(m,a[i]) , M=max(M,a[i]) ;
    if(M-m > k) { printf("NO\n") ; return 0 ; }
    printf("YES\n") ;
    int q=m/k , r=m-q*k ;
    for(int i=1;i<=k;i++) b[i]=i<=r ? q+1 : q ;
    for(int i=1;i<=n;i++)
    {
        int d=a[i]-m ;
        for(int j=1;j<=k;j++)
        {
            int tm= d>0 ? b[j]+1 : b[j] ; d-- ;
            while(tm--) printf("%d ",j) ;
        }
        printf("\n") ;
    }
}
 

D :

#include<bits/stdc++.h>
#define MAX 100000000007
#define LL long long
using namespace std;
 
LL a[200][200] ;
set<LL> st ;
main()
{
    int n,m ; scanf("%d%d",&n,&m) ;
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
        scanf("%I64d",&a[i][j]) ;
    if(n==1)
    {
        printf("YES\n%I64d\n",MAX) ;
        printf("0\n") ;
        for(int i=1;i<=m;i++) printf("%I64d%c",a[1][i],i==m?'\n':' ') ;
        return 0 ;
    }
    if(m==1)
    {
        printf("YES\n%I64d\n",MAX) ;
        for(int i=1;i<=n;i++) printf("%I64d%c",a[i][1],i==n?'\n':' ') ;
        printf("0\n") ;
        return 0 ;
    }
 
    for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++)
        for(int k=1;k<=m;k++) for(int l=k+1;l<=m;l++)
        st.insert(a[i][k]+a[j][l]-a[i][l]-a[j][k]) ;
 
    LL now=*st.begin() ;
    for(auto i : st) now=__gcd(now,i) ;
    if(now<0) now=-now ;
 
    if(now)
    {
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
            if(a[i][j]>=now)
                { printf("NO\n") ; return 0 ; }
    }
 
    LL ans ;
    if(!now) ans=MAX ;
    else ans=now ;
 
    printf("YES\n%I64d\n",ans) ;
    for(int i=1;i<=n;i++) printf("%I64d%c",a[i][1],i==n?'\n':' ') ;
    for(int i=1;i<=m;i++)
        printf("%I64d%c",((a[1][i]-a[1][1])%ans+ans)%ans,i==m?'\n':' ') ;
}
 

E :

#include<bits/stdc++.h>
#define LL long long
#define DB double
using namespace std;
const int maxn=500000+100 ;
 
char s[maxn] ;
int n,a[maxn] ;
LL sum1[maxn],sum2[maxn],sum[maxn] ;
main()
{
    scanf("%s",s+1) ;
    set<char> st={'A','E','I','O','U','Y'} ;
    n=strlen(s+1) ;
    for(int i=1;i<=n;i++)
        a[i]= st.count(s[i]) ? 1 : 0 ;
 
    sum[0]=sum1[0]=0LL ;
    for(int i=1;i<=n;i++)
        sum1[i]=sum1[i-1]+i*a[i] ,
        sum[i]=sum[i-1]+a[i] ;
    sum2[n+1]=0LL ;
    for(int i=n;i>=1;i--) sum2[i]=sum2[i+1]+(n+1-i)*a[i] ;
 
    DB ans=0.0 ;
    for(int len=1;len<=n;len++)
    {
        LL add=0LL ;
        if(n>=2*len-1)
        {
            add+=sum1[len-1] ;
            add+=sum2[n-len+2] ;
            add+=(sum[n-len+1]-sum[len-1])*len ;
        }
        else
        {
            int t=n-len ;
            add+=sum1[t] ;
            add+=sum2[n-t+1] ;
            add+=(sum[n-t]-sum[t])*(n-len+1) ;
        }
        DB add2= ((DB)add)/((DB)len) ;
        ans+=add2 ;
    }
    printf("%.10f\n",ans) ;
}
 

沒有留言:

張貼留言