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

2016 Multi-University Training Contest 2

2016-08-25 17:56 281 查看
这场 也是很遗憾的四题,

第五题真的不知道为何wa,很奇怪,想得也差不多



1001 Acperience 18.24%(504/2763)

1002 Born Slippy 12.27%(20/163)

1003 Call It What You Want 0.00%(0/215)

1004 Differencia 10.13%(8/79)

1005 Eureka 6.13%(129/2103)

1006 Fantasia 8.00%(30/375)

1007 Glorious Brilliance 3.28%(2/61)

1008 Helter Skelter 5.62%(20/356)

1009 It’s All In The Mind 34.33%(709/2065)

1010 Join The Future 14.81%(4/27)

1011 Keep On Movin 47.73%(694/1454)

1012 La Vie en rose 33.41%(284/850)

1013 Memento Mori 4.17%(1/24)

1009

给你一个序列a

满足三个条件

0<=ai<=100

a1>=a2>=a3………

a1+a2+a3+…..an!=0

然后告诉你序列a 的长度n, 以及已知m个ai ,然后m行 每行输入x,y ,告诉你 ax=y。

求 a1+a2/ (sum) 的最大值

sum=a1+a2+ a3+……+an ’

简单题

要使得结果最大,即让 a3+a4+….+an 最小 , 根据条件2,我们从后往前 可以确定 a3+…an ,然后有性质

x1/y1 > x2/y2 只要 x1>x2 && y1>y2 所以我们让a1+a2 最大即可

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#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;

int a[105];
int main(){
//freopen("1.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
memset(a,-1,sizeof(a));
int n,m;
scanf("%d %d",&n,&m);
while(m--){
int x,y;
scanf("%d %d",&x,&y);
a[x]=y;
}
int cnt=0;
for(int i=n;i>2;i--){
if(a[i]==-1){
a[i]=cnt;
}
else{
cnt=a[i];
}
}
if(a[1]==-1){
a[1]=100;
}
if(a[2]==-1){
a[2]=a[1];
}
int fenzi=0,fenmu=0;
for(int i=1;i<=n;i++){
fenmu+=a[i];
}
fenzi=a[1]+a[2];
cnt=gcd(fenzi,fenmu);
fenzi/=cnt;
fenmu/=cnt;
printf("%d/%d\n",fenzi,fenmu);
}

return 0;
}


1011 Keep On Movin

记得是队友A的,刚刚自己做了一遍,发现也是简单题。

给你序列a, 代表字符i有a[i]个, 问可形成的 回文串 集合中的 最小长度回文串的最大长度。

题目中有一个样例解释,看下就能明白。

一开始以为二分长度 去判断, 但是时间复杂度不够,而且我去想判断的时候,发现直接就可以判断出来。

如果存在奇数,那么肯定就要分出一串。

例如

1 3 4 2

就必然要最少形成两串

那么我们统计一下总长度 , 然后 形成一串先放一个进去,也就是那个奇数 字符, 然后用总长度len-ji (形成多少串), 然后我们把剩下的平均插进这个串中形成回文串, 即len/ji ,但如果是这个数是奇数,我们就不可以插入奇数个,因为要形成回文串,所以就只能-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>
#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;

int a[100005];
int ji;
int sum;
int main(){
//freopen("1.txt","r",stdin);
int t;
while(~scanf("%d",&t)){
while(t--){
int n;
ji=sum=0;
scanf("%d",&n);
int len=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
len+=a[i];
if(a[i]&1){
ji++;
}
}
if(ji==0 || ji==1){
printf("%d\n",len);
continue;
}
len-=ji;
int cnt=len/ji;
if(cnt&1)
cnt--;
printf("%d\n",cnt+1);
}
}

return 0;
}


1001

这题,很无语

wa 了一万发, 很艰难的数学推导,对于我们这种数学基础基本为0 的队伍,这种题就像一座大山挡着。。。

题意:

B=(b1,b2,…,bn) (bi∈{+1,−1}) α≥0 W=(w1,w2,…,wn)

然后求

∑|| Wi- aBi || ^ 2 的 最小值 i=1…2….3….n



#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mem(a) memset(a,0,sizeof(a))
#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; }
bool cmpbig(int a,int b){return a>b;}
bool cmpsmall(int a,int b){return a<b;}
using namespace std;
__int64 w[100005];

int main(){
//freopen("1.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
__int64 sum=0;
for(int i=1;i<=n;i++){
scanf("%I64d",&w[i]);
sum+=abs(w[i]);
}
__int64 ans=0;
for(int i=1;i<=n;i++){
ans+=(__int64)(abs(w[i])*abs(w[i])*n);
}
ans-=(__int64 )sum*sum;
//       printf("as=%I64d\n",ans);
__int64 flag=gcd((__int64)ans,(__int64)(n));
printf("%I64d/%I64d\n",(__int64)ans/flag , (__int64)(n)/flag);
}
return 0;
}


1012

在比赛的时候,n*m 的傻逼暴力都可以过。 显然是数据太水

赛后加了数据,nm怎么也不能放过去啊,真的坑爹

正解:

bitset

容我先学学bitset
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: