2015百度之星资格赛题解

来源:互联网 发布:在线编译c语言 编辑:程序博客网 时间:2024/06/01 12:39

1001:

可以看作找规律,其实是组合数学的一道题目。符合要求的对应关系是要么是自己和自己对应,要么是互相对应,即1->2则2->1。

因为对于任何一个数如果他和自己本身对应,那么剩下还有n-1个数;如果他对应别的数(假定是a),那么a一定也和他对应,这样剩下还有n-2

个数,并且他可以对应的数的选择有n-1种,所以,可得递推关系 f[i]=((i-1)*f[i-2]+f[i-1]);

#include<iostream>using namespace std;long long f[1000002];int main(){int T;f[1]=1,f[2]=2;for(int i=3;i<=1000000;i++)f[i]=((i-1)*f[i-2]%1000000007+f[i-1]%1000000007)%1000000007;long long n;cin>>T;int cas=1;while(T--){cin>>n;cout<<"Case #"<<cas++<<":"<<endl;cout<<f[n]<<endl;}return 0;}

1003:

模拟题+字符串处理,用istringstream处理输入的字符串,取出数字进行&操作,最后将地址放入set,自动去重。

注意一点,最后不要偷懒 去掉数字之间的‘.’,因为会造成wa,假如数字分别是8.28和82.8会当作一样的,造成错误。

#include<iostream>#include<set>#include<string>#include<sstream>#include<stack>#include<algorithm>using namespace std;set <string> st;stack <int> stk;int num;int res[1005][5]; int tar[5];int main(){int T,n,m;string s,s1,sk;cin>>T;int cas=1;while(T--){cin>>n>>m;for(int i=1;i<=n;i++){int p=1;    cin>>sk;    for(int k=0;k<sk.length();k++)    if(sk[k]=='.')    sk[k]=' ';    istringstream inna(sk);    while(inna>>num)    {    res[i][p++]=num;    }    }int op=1; cout<<"Case #"<<cas++<<":"<<endl;for(int i=1;i<=m;i++){st.clear();cin>>s1;for(int k=0;k<s1.length();k++)    if(s1[k]=='.')    s1[k]=' ';istringstream  in(s1);int tarn=1;while(in>>num){tar[tarn++]=num;}for(int i=1;i<=n;i++){ string nnn;for(int j=1;j<=4;j++){   int now=tar[j]&res[i][j]; while(now){stk.push(now%10);now/=10;}while(!stk.empty()){   nnn+=stk.top()+'0';   stk.pop();}nnn+='.';//坑比 } st.insert(nnn);} cout<<st.size()<<endl;}}return 0;}

1004 简单的博弈,也算计算几何吧。  hint里面有提示,所以根据nim博弈的规则,只要先手能将盘子放入中央,那么一定获胜,因为要么后手放不下,要么先手总是可以和后手关于中心对称放置,取得胜利。画下图,简单的几何关系。

#include<iostream>#include<cmath>using namespace std;#define pi 3.14159265358int main(){int T;cin>>T;double n,a,r;int cas=1;while(T--){cin>>n>>a>>r;double cur=0.0;cur=a/2/(tan(pi/n));cout<<"Case #"<<cas++<<":"<<endl;if(r<=cur)cout<<"Give me a kiss!"<<endl;else    cout<<"I want to kiss you!"<<endl;}return 0;} 




1 0