【总结】2014新生暑假个人排位赛02
A. 丁神去谷歌 2014新生暑假个人排位赛02
题目描写叙述
丁神要去Google上班了,去之前丁神想再做一道水题,但时间不多了,所以他希望题目做起来既水又快。如今一共同拥有
输入格式
输入第一行为数据组数
输出格式
对于每组数据,输出相应的题目编号,每一个输出占一行。
输入例子
1
2
3 5
4 8
输出例子
2
这题一開始排序了,显然不能排序,100W了已经#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
struct Num
{
int a,b,id;
}num[111111];
bool cmp(Num my,Num s)
{
return my.a==s.a?my.id<s.id:my.a<s.a;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/in.txt","r",stdin);
//freopen();
#endif
int T;
scanf("%d",&T);
while(T--)
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&num[i].a,&num[i].b);
num[i].id=i;
}
Num ans=num[1];
for(int i=1;i<=n;i++)
{
if((num[i].b*1.0/num[i].a)>(ans.b*1.0/ans.a))
{
ans=num[i];
}
else if((num[i].b*1.0/num[i].a)==(ans.b*1.0/ans.a))
{
if(num[i].a<ans.a)
{
ans=num[i];
}
else if (num[i].a==ans.a)
{
if(num[i].id<ans.id)
ans=num[i];
}
}
}
printf("%d\n",ans.id);
}
return 0;
}B. 丁神又去谷歌 2014新生暑假个人排位赛02
题目描写叙述
丁神又要去Google上班了,这一次丁神想多做几道水题,并使题目的总水量最大.丁神同一时刻仅仅能在水一道题,仅仅有做完这道题才干得到它的水值,丁神的总时间为
输入格式
输入第一行为数据组数
输出格式
对于每组数据,输出相应的最大总水量,每一个输出占一行。
输入例子
1
10 2
8 16
6 12
输出例子
16
裸01背包#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
const int N=111111;
long long w[N];
long long v[N];
long long dp[1111];
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/in.txt","r",stdin);
//freopen();
#endif
long long T,t,n;
cin>>T;
while(T--)
{
memset(dp,0,sizeof(dp));
cin>>t>>n;
//cout<<"n::"<<t<<endl;
for(long long i=0;i<n;i++)
{
cin>>w[i]>>v[i];
}
for(long long i=0;i<n;i++)
{
for(long long j=t;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout<<dp[t]<<'\n';
}
return 0;
}
C. goblin 2014新生暑假个人排位赛02
题目描写叙述
现有一段横向长度为N的山脉,当中每段有一个独一无二的高度Hi(1到N之间的正整数)。如今你想知道对于长度为N的山脉,可能有这种山脉多少种。这种山脉是:某个位置要么比两边的高度都低,要么比两边的高度都高。两座山脉 A和 B 不同当且仅当存在一个 i,使得 Ai≠Bi。因为这个数目可能非常大,你仅仅对它除以 P 的余数感兴趣。
输入格式
输入以EOF为结束,每组仅含一行,两个正整数 N, P。 3≤N≤4200,P≤10^9
输出格式
对于每组数据输出仅含一行,一个非负整数,表示你所求的答案对 P 取余之后的结果。
输入例子
4 7
输出例子
3
说明:共同拥有 10 种可能的山脉,它们是:
1324 1423 2143 2314 2413
3142 3241 3412 4132 4231
这题非常有意思,会爆内存,那么,我们还是申请int类型的数组来存数据,在运算的时候转化一下就是了。#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=4333;
int c[N][N];
int g[N];
int n,p;
int main()
{
while(scanf("%d%d",&n,&p)!=EOF)
{
memset(g,0,sizeof(g));
c[1][0]=1;
c[1][1]=1;
g[0]=g[1]=1%p;g[2]=1%p;g[3]=2%p;
for(int i=2;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0||j==i)
c[i][j]=1;
else
c[i][j]=(c[i-1][j]%p+c[i-1][j-1]%p)%p;
}
}
/*for(int i=1;i<=8;i++)
{
for(int j=1;j<=i;j++)
cout<<"i::"<<i<<"j::"<<j<<' '<<c[i][j]<<endl;
}*/
for(int j=3;j<=n;j++)
{
for(int i=0;i<=j-1;i+=2)
{
//cout<<g[j+1]<<endl;
g[j+1]=(g[j+1]+((long long)c[j][i]%p*(long long)g[i]%p*(long long)g[j-i])%p)%p;
//g[j+1]/=2;
if(((j+1)&1)&&i==0)
g[j+1]=g[j+1]*2%p;
}
}
printf("%d\n",(g[n]*2)%p);
}
return 0;
}D. 学姐逗学弟 2014新生暑假个人排位赛02
题目描写叙述
学弟们来了之后,学姐每天都很高兴的和学弟一起玩耍。这一天,学姐想出了这样一个游戏,她画了一棵树,树上共同拥有
输入格式
输入第一行为一个整数
输出格式
假设学姐能胜利,输出"MengMengDa!",否则输出"So sad..."。没有引號。
输入例子
1
3 1
1 1
1
输出例子
MengMengDa!
everySG,正好前一天晚上看了EVERYSG。先算各个节点的SG值,再算各个节点的步数(赢的节点的步数是儿子节点中输的节点中的最大步数+1,输的节点的步数是儿子节点中赢的节点中的最小步数+1)。节点仅仅关心有没有石头而不关心有几个石头,由于有几个石头都是一样的。找出给出的节点中最长的步数,奇数则先手赢,偶数则后手赢
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;
#define N 111111
vector<int> G[N];
int getLosestep(int x);
int fa[N];
int sg[N];
int step[N];
int getsg(int x)
{
if(sg[x]!=-1)
return sg[x];
bool vis[11111];
memset(vis,0,sizeof(vis));
for(int i=0;i<G[x].size();i++)
{
vis[getsg(G[x][i])]=true;
}
for(int i=0;i<11111;i++)
{
if(!vis[i])
{
return sg[x]=i;
}
}
}
/*int getWinstep(int x)
{
int ans=0;
if(winstep[x]!=-1)
return winstep[x];
for(int i=0;i<G[x].size();i++)
{
if(sg[G[x][i]==0])
{
ans=max(ans,getLosestep(G[x][i]));
ans++;
}
}
return winstep[x]=ans;
//cout<<"x::"<<
}
int getLosestep(int x)
{
int ans=(1<<29);
if(losestep[x]!=-1)
return losestep[x];
for(int i=0;i<G[x].size();i++)
{
if(sg[G[x][i]!=0])
{
ans=min(ans,getWinstep(G[x][i]));
ans++;
}
}
if(ans==(1<<29))
ans=0;
return losestep[x]=ans;
}*/
int getstep(int x)
{
if(step[x]!=-1)
return step[x];
//if(G[x].size()==0)
//return 0;
if(sg[x]==0)
{
if(step[x]!=-1)
return step[x];
int ans=1<<29;
if(G[x].size()==0)
return step[x]=0;
for(int i=0;i<G[x].size();i++)
{
if(sg[G[x][i]]!=0)
{
ans=min(ans,getstep(G[x][i]));
}
}
return step[x]=ans+1;
}
else
{
if(step[x]!=-1)
return step[x];
int ans=0;
if(G[x].size()==0)
return step[x]=0;
for(int i=0;i<G[x].size();i++)
{
if(sg[G[x][i]]==0)
{
ans=max(ans,getstep(G[x][i]));
}
}
return step[x]=ans+1;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/in.txt","r",stdin);
//freopen();
#endif
int T;
scanf("%d",&T);
while(T--)
{
for(int i=0;i<N;i++)
G[i].clear();
//memset(winstep,-1,sizeof(winstep));
//memset(losestep,-1,sizeof(losestep));
memset(step,-1,sizeof(step));
memset(sg,-1,sizeof(sg));
int n,m;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++)
{
scanf("%d",&fa[i]);
}
for(int i=2;i<=n;i++)
{
G[fa[i]].push_back(i);
}
for(int i=1;i<=n;i++)
getsg(i);
//getWinstep(1);
//getLosestep(1);
//getWinstep(1);
//getLosestep(1);
for(int i=1;i<=n;i++)
getstep(i);
int longwin=0;
int shortlose=0;
for(int i=1;i<=m;i++)
{
int pos;scanf("%d",&pos);
if(sg[pos]==0)
{
shortlose=max(shortlose,step[pos]);
}
else
{
longwin=max(longwin,step[pos]);
}
}
/*if(shortlose==(1<<29)) shortlose=0;
//cout<<"sg::"<<sg[1]<<endl;
//cout<<"l,s::"<<longwin<<","<<shortlose<<endl;*/
if(longwin>shortlose)
puts("MengMengDa!");
else
puts("So sad...");
}
return 0;
}E. 木头人足球赛 2014新生暑假个人排位赛02
题目描写叙述
木头人星的行动速度是地球上乌龟的
输入格式
第一行为组数
输出格式
每组数据一行,假设 Mays 队10号队员直接能够射门得分,则输出“Shoot!”;假设10号队员不能成功射门,输出"Poor Mays!".
输入例子
1
104 34
1 24 2.928
48 25 2.605
15 41 1.312
39 42 2.454
3 12 2.080
18 39 1.564
10 36 2.530
97 13 1.589
101 57 1.844
84 39 2.561
0 33 1.831
输出例子
Shoot!
还在写,,,= =!还没写粗,,,wa了
浙公网安备 33010602011771号