2016 Multi-University Training Contest 3

1001 Sqrt Bo 33.06%(806/2438)
1002 Permutation Bo 46.85%(618/1319)
1003 Life Winner Bo 15.74%(301/1912)
1004 Gambler Bo 13.86%(37/267)
1005 Boss Bo 13.33%(2/15)
1006 Product Bo 0.00%(0/10)
1007 Explorer Bo 6.62%(28/423)
1008 Gardener Bo 0.00%(0/13)
1009 Palindrome Bo 8.33%(4/48)
1010 Rower Bo 20.03%(264/1318)
1011 Teacher Bo 38.71%(593/1532)

四题GG

1001
比赛的时候队友用大数模板做的, 刚看了下 觉得也没必要
我们可以用2 ,平方5次 可以得到 1475789056
那么我们输入的只要 小于这个数,则肯定可以在五次以内 开根 出1. 如果大于这个则不可。
数字和字符串转换一下即可。

有一发wa ,是没有特判0的情况, 确实0 不可能开根出1 。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<bitset>
#define mem(a) memset(a,0,sizeof(a))
#define ll __int64
#define INF 0x7fffffff   //INT_MAX
#define inf 0x3f3f3f3f   //
const double PI = acos(-1.0);
const double e = exp(1.0);
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
using namespace std;

string maxn="1475789056";
char cnt[1005];
ll poww(int l){
    ll ans=1;
    for(int i=1;i<=l;i++)
        ans*=10;
    return ans;
}
int main() {
    //freopen("1.txt","r",stdin);
    while(~scanf("%s",cnt)){
//      printf("l=%d\n",maxn.length());
         int len=strlen(cnt);
         string cnt2;
         for(int i=0;i<len;i++)
             cnt2.push_back(cnt[i]);
//       cout<<cnt2<<endl;

         if(cnt2.length()>10){
             printf("TAT\n");
             continue;
         }
         int num=0;
         ll ans=0;
         for(int i=0;i<cnt2.length();i++){
//           cout<<cnt2[i]<<" "<<cnt2.length() <<endl;
             ans+=(cnt2[i]-'0')*poww(cnt2.length()-i-1);
         }
         if(ans==0){ // 0的情况确实要特判一下
             printf("TAT\n");
             continue;
         }
         while(ans>1){
             ans=sqrt(ans);
             num++;
         }
         if(num>5){
             printf("TAT\n");
             continue;
         }
         cout<<num<<endl;

    }
    return 0;
}

1002
比赛的时候 觉得这是个 数学题,不是很擅长= = 推半天没推出来,队友就过了= =
既然数学推理不行,你就学着找规律呗, 大哥 不会数学下次就别xjb 推了,老老实实去找规律就好了。

题意:
给你一个序列c , 一个序列h ,h是1-n 的数, h0=hn+1=0;
求 [ hi>hi-1 && hi>hi+1 ] * ci 的期望。
也就是某个i 比左右都大 的概率* ci 的值 的和。

也不知道理解的对不对,反正数学博大精深= =
随便写写 n=3时
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1位置的贡献了3次 2位置贡献了2次 3位置贡献了3次 : 3 2 3

n=4时
1 2 3 4 2 1 3 4 3 1 2 4 4 1 2 3
1 2 4 3 2 1 4 3 3 1 4 2 4 1 3 2
1 3 2 4 2 3 1 4 3 2 1 4 4 2 1 3
1 3 4 2 2 3 4 1 3 2 4 1 4 2 3 1
1 4 2 3 2 4 1 3 3 4 1 2 4 3 1 2
1 4 3 2 2 4 3 1 3 4 2 1 4 3 2 1
一共24 个排列。 其中 1位置贡献 12 = 4位置, 2位置贡献8次 3位置 贡献8次
也就是 12 8 8 12
有兴趣可以在写一组5的
可以发现 位置1 和 位置n 的贡献度是一样的 = 1/2
中间的为位置 贡献度 显然为 8/24 =1/3

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<bitset>
#define mem(a) memset(a,0,sizeof(a))
#define ll __int64
#define INF 0x7fffffff   //INT_MAX
#define inf 0x3f3f3f3f   //
const double PI = acos(-1.0);
const double e = exp(1.0);
template<class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<class T> T lcm(T a, T b) { return a / gcd(a, b) * b; }
using namespace std;

double p[1010];
int main()
{
    freopen("1.txt","r",stdin);
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==1)
        {
            scanf("%lf",&p[0]);
            printf("%.6lf\n",p[0]);
            continue;
        }
        double ans=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lf",&p[i]);
            if(i==0||i==n-1)
            {
                ans+=(1.0/2.0)*p[i];
            }
            else
            {
                ans+=(1.0/3.0)*p[i];
            }
        }
        printf("%.6lf\n",ans);
    }
    return 0;
}

1011
想了半天都没想到这个乱搞的方法
我想了很久, 在脑子里毙掉了 队友过的哪种方法(即正解), 后面也没咋相通为什么不会T

大概就是这样的

for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                int k=abs(p[i].x-p[j].x)+abs(p[i].y-p[j].y);
                if(!v[k])
                    v[k]=1;
                else
                {
                    bz=1;
                    break;
                }
            }
            if(bz) break;
        }

现在想想 好像似乎 不会超时。

这题的突破口就在于 他给的m 范围小于 1e5 ,为什么他不给1e9呢? 1e9就是我脑子里一直在想的题目,我一直都没有注意这个条件。
曼哈顿距离 最大的点就是 (1e5,1e5) 也就是2e5;
所以 无论 n 有多大

我们在计算两点距离的时候, 最多只会计算 2e5次, 如果再多的话就必然会出现重复,所以也就T
fori
for(j=i+1 是为了避免 a-b 和b-a 重复计算两次。

这题真是个教训,做题总是不带脑子,非得把题目想死,不开窍!而且还不重视一些很明显的条件。

1010
一个物理题,有个学弟还是搞物理竞赛的, 积分积分就可以推出个公式,= = 哀伤,下次再出这种题可咋办= =。
这里写图片描述

1003
博弈题,熊神搞了很久很久,最后差一点过了。
原因就是 那个皇后(貌似) 是没有规律的, 之前我们找的规律是错误的, 我们往后又找了一些才发现这个东西并不规律, 据说大多人都是打表过的。。。
哀伤,博弈很想丢给熊神呢 QAQ。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值