A. 丁神去谷歌
注意将除法改成交叉相乘
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
const int MAXN=10000000000;
int n;
int main()
{
long long T,ma,mb,num=0;
read(T);
while(T--)
{
int a,b;
read(n);
read(ma),read(mb),num=1;
for(int i=1;i<n;i++)
{
read(a);read(b);
if(b*ma>a*mb)
{
ma=a;
mb=b;
num=i+1;
}
else if(b*ma==a*mb&&ma>a)
{
ma=a;
mb=b;
num=i+1;
}
else if(b*ma==a*mb&&ma==a&&num>i+1)
{
ma=a;
mb=b;
num=i+1;
}
}
printf("%lld\n",num);
}
return 0;
}
B. 丁神又去谷歌
裸01背包
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-------------------------------------------------------------------
typedef long long ll;
struct Node
{
int ti,w;
}a[110];
int n,t;
ll dp[110][1010];
int main()
{
int T;
read(T);
while(T--)
{
memset(dp,0,sizeof(dp));
read(t);read(n);
for(int i=1;i<=n;i++)
{
read(a[i].ti);read(a[i].w);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=t;j++)
{
dp[i][j]=dp[i-1][j];
if(a[i].ti<=j)
dp[i][j]=max(dp[i-1][j-a[i].ti]+a[i].w,dp[i][j]);
}
}
printf("%lld\n",dp[n][t]);
}
return 0;
}
C. goblin
數學題,排列組合。 首先,我們注意到這道題的某些公式,取模時候的除法,因為p不一定是質數,是以不一定能夠用費馬小定理求出逆元,是以一定要改變方法。 其次,我們可以發現這題是要求波浪數的個數,這種時候我比較推薦大家打表找規律,如形如/\/\/\/\/\(下稱為A型)或者\/\/\/\/\/\/(下稱為B型)的數字,當數字位數相同的時候,我們可以得知,A型數和B型數的個數是 相同的,這一點我們可以通過逆序數證明,大家可以去百度一下證明方法。 那麼,我們就可以将某些除以二的公式給略加改進
g[i]表示的是A型(也可以是B型,但隻能是其中一個)的波浪數個數,用組合數學的 插入法求出遞推公式,注意,此時的g[i]隻能當做一種類型來使用,是以每次記錄都是j+=2的情況。
另外,如果數組都用long long 型,記憶體會爆,如果計算過程不用long long ,資料會爆。
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define EPS 1e-10
#define eps 1e-8
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-------------------------------------------------------------------
const int MAXN=4300;
int n,p;
int g[MAXN];
int c[MAXN][MAXN];
int main()
{
// freopen("data.txt","r",stdin);
while(read(n)&&read(p))
{
memset(g,0,sizeof(g));
for(int i=1;i<=n;i++)
c[i][0]=1;
c[1][1]=1;
for(int i=2;i<=n;i++)
{
c[i][i]=1;
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]%p+c[i-1][j]%p)%p;
}
g[0]=1%p;g[1]=1%p;g[2]=1%p;g[3]=2%p;
for(int i=4;i<=n;i++)
for(int j=0;j<=i-1;j+=2)
g[i]=(g[i]+((long long)c[i-1][j]%p*(long long)g[j]%p*(long long)g[i-1-j])%p)%p;
g[n]=(g[n]*2)%p;
/* int ans=0;
for(int i=0;i<n;i++)
a[i]=i+1;
do
{
int i;
for(i=1;i<n-1;i++)
{
if(a[i]>a[i-1]&&a[i]>a[i+1])
continue;
else if(a[i]<a[i-1]&&a[i]<a[i+1])
continue;
break;
}
if(i==n-1)
ans++;
}while(next_permutation(a,a+n));
cout<<n<<" : "<<ans<<endl;*/
cout<<g[n]<<endl;
}
return 0;
}
D. 學姐逗學弟
裸的EVERY SG 自己去看看模闆或者解法吧.......
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
//-------------------------------------------------------------------
const int MAXN=100010;
int n,m;
vector<int> a[MAXN];
int sg[MAXN],po[MAXN];
bool mex[MAXN];
int step[MAXN];
void dfs(int x)
{
if(sg[x]!=-1)
return;
int sz=a[x].size(),maxx=-1*MAXN,minn=MAXN;
for(int i=0;i<sz;i++)
{
dfs(a[x][i]);
if(sg[a[x][i]]==0)
maxx=max(maxx,step[a[x][i]]);
minn=min(minn,step[a[x][i]]);
}
memset(mex,0,sizeof(bool)*(sz+10));
for(int i=0;i<sz;i++)
mex[sg[a[x][i]]]=true;
for(int i=0;i<sz+1;i++)
if(!mex[i])
{
sg[x]=i;
break;
}
if(sg[x]==0)
step[x]=minn+1;
else
step[x]=maxx+1;
if(sz==0)
step[x]=0;
// cout<<x<<" :"<<sg[x]<<endl;
}
void init()
{
for(int i=0;i<MAXN;i++)
a[i].clear();
memset(sg,-1,sizeof(sg));
memset(po,0,sizeof(po));
memset(step,0,sizeof(step));
}
int main()
{
int T;
read(T);
while(T--)
{
read(n);read(m);
init();
for(int i=2;i<=n;i++)
{
int temp;
read(temp);
a[temp].push_back(i);
}
for(int i=0;i<m;i++)
read(po[i]);
dfs(1);
int ans=-1;
for(int i=0;i<m;i++)
{
ans=max(step[po[i]],ans);//cout<<step[po[i]]<<" ";
}// cout<<endl;
if(!(ans&1))
puts("So sad...");
else
puts("MengMengDa!");
}
return 0;
}
E. 木頭人足球賽
計算幾何 大堯神代碼
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
//#define LOCAL
using namespace std;
struct point
{
double x,y,d,AngleUp,AngleDown;
}Luke[20];
struct PP
{
double x,y;
}UnCovered[20];
const double eps=1e-7;
const double pi=acos(-1.0);
double xo,yo,AngleUp,AngleDown;
int negativecnt;
bool flag;
bool GetLukeAngle(int x)
{
int i;
double d=sqrt((xo-Luke[x].x)*(xo-Luke[x].x)+(yo-Luke[x].y)*(yo-Luke[x].y));
//printf("d=%lf\n",d);
if(abs(Luke[x].d-d)<eps)return false;
double a=asin(Luke[x].d/d),b;
//printf("a=%lf\n",a);
double dy=Luke[x].y-yo,dx=Luke[x].x-xo;
//printf("dy=%lf dx=%lf\n",dy,dx);
b=atan2(dy,dx);
//printf("b=%lf\n",b);
if(b>eps)b=3*pi/2-b;
else if(b<-eps)b=-pi/2-b;
else b=pi*3/2;
Luke[x].AngleDown=b-a;
Luke[x].AngleUp=b+a;
//printf("Luke[%d].Angledown=%lf Luke[%d].AngleUp=%lf\n",x,Luke[x].AngleDown,x,Luke[x].AngleUp);
return true;
}
bool cmp(const point &a,const point &b)
{
if(abs(a.AngleDown-b.AngleDown)<eps)return a.AngleUp+eps<b.AngleUp;
return a.AngleDown+eps<b.AngleDown;
}
void Init()
{
scanf("%lf%lf",&xo,&yo);//printf("xo=%lf yo=%lf\n",xo,yo);//cout<<xo<<' '<<yo<<endl;
AngleUp=atan2(38.000-yo,-xo);
if(AngleUp<-eps)AngleUp=-AngleUp-pi/2;
else if(AngleUp>eps) AngleUp=pi*3/2-AngleUp;
AngleDown=atan2(30.000-yo,-xo);
if(AngleDown<-eps)AngleDown=-AngleDown-pi/2;
else if(AngleDown>eps) AngleDown=pi*3/2-AngleDown;
//printf("Angledown=%lf AngleUp=%lf\n",AngleDown,AngleUp);
//cout<<AngleDown<<' '<<AngleUp<<endl;
flag=true;
for(int i=1;i<=11;i++)
{
scanf("%lf %lf %lf",&Luke[i].x,&Luke[i].y,&Luke[i].d);
if(flag==true)flag=GetLukeAngle(i);
}
//cout<<flag<<endl;
}
void Solve()
{
sort(Luke+1,Luke+1+11,cmp);//for(int i=1;i<=11;i++)printf("Luke[%d].Angledown=%lf Luke[%d].AngleUp=%lf\n",i,Luke[i].AngleDown,i,Luke[i].AngleUp);
//for(int i=1;i<=11;i++)printf("Luke[%d].Angledown=%lf Luke[%d].AngleUp=%lf\n",i,Luke[i].AngleDown,i,Luke[i].AngleUp);
flag=false;
double start=AngleDown;
for(int i=1;i<=11;i++)
{
if(Luke[i].AngleUp+eps<AngleDown)continue;
if(Luke[i].AngleDown>AngleUp+eps)continue;
if(Luke[i].AngleDown>start+eps)
{
flag=true;break;
}
else if(Luke[i].AngleUp>start+eps)start=Luke[i].AngleUp;
}
if(flag==false&&start+eps<AngleUp)flag=true;
}
int main()
{
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif // LOCAL
int T;
scanf("%d",&T);
//cout<<T<<endl;
while(T--)
{
Init();//if(T==6)printf("%d\n",flag);
if(flag==true)Solve();
if(flag)printf("Shoot!\n");
else printf("Poor Mays!\n");
//Solve();
}
return 0;
}