您的位置:首页 > 大数据 > 人工智能

2016 Multi-University Training Contest 3

2016-08-27 00:08 281 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: