花
刚开始感觉是组合数学…没想到是跟喝汤差不多的一道DP.
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
#define ll long long
ll dp[maxn][4][2];
const int mod=1e9+7;
void init(ll s){
memset(dp,0,sizeof(dp));
dp[1][1][0]=s;
}
int main(){
int t;scanf("%d",&t);
while(t--) {
ll n, s;
scanf("%lld%lld", &n, &s);
init(s);
for(int i=2;i<=n;++i){
dp[i][1][0]=(dp[i-1][1][0]*(s-1)%mod+dp[i-1][2][0]*(s-1)%mod)%mod;
dp[i][2][0]=dp[i-1][1][0];
dp[i][3][1]=dp[i-1][2][0];
dp[i][1][1]=((dp[i-1][1][1]*(s-1)%mod+dp[i-1][2][1]*(s-1)%mod)%mod+dp[i-1][3][1]*(s-1)%mod)%mod;
dp[i][2][1]=dp[i-1][1][1];
}
ll res=0;
res=((dp[n][1][1]+dp[n][2][1])%mod+dp[n][3][1])%mod;
printf("%lld\n",res);
}
return 0;
}
五子棋
模拟 斜线那个注意一下.
#include <bits/stdc++.h>
using namespace std;
int mapp[250][250];
bool check_updown(int x,int y)
{
int sum=1;
for(int i=x+1;i<=225;++i){
if(mapp[x][y]==mapp[i][y]) sum++;
else break;
}
for(int i=x-1;i>=1;--i){
if(mapp[x][y]==mapp[i][y]) sum++;
else break;
}
if(sum>=5) return 1;
return 0;
}
bool check_rightle(int x,int y)
{
int sum=1;
for(int i=y+1;i<=225;++i){
if(mapp[x][y]==mapp[x][i]) sum++;
else break;
}
for(int i=y-1;i>=1;--i){
if(mapp[x][y]==mapp[x][i]) sum++;
else break;
}
if(sum>=5) return 1;
return 0;
}
bool check_rightxie(int x,int y)
{
int sum=1;
for(int i=1;x+i<=225&&y+i<=225;++i){
if(mapp[x][y]==mapp[x+i][y+i]) sum++;
else break;
}
for(int i=1;x-i>=1&&y-i>=1;++i){
if(mapp[x][y]==mapp[x-i][y-i]) sum++;
else break;
}
if(sum>=5) return 1;
return 0;
}
bool check_leftxie(int x,int y)
{
int sum=1;
for(int i=1;x+i<=225&&y-i>=1;++i){
if(mapp[x][y]==mapp[x+i][y-i]) sum++;
else break;
}
for(int i=1;x-i>=1&&y+i<=225;++i){
if(mapp[x][y]==mapp[x-i][y+i]) sum++;
else break;
}
if(sum>=5) return 1;
return 0;
}
int check_all(int x,int y)
{
if(check_leftxie(x,y)||check_updown(x,y)||check_rightle(x,y)||check_rightxie(x,y))
{
return 1;
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
int x,y;
int flag=0;
for(int i=1; i<=t; ++i)
{
scanf("%d%d",&x,&y);
if(flag) continue;
if(i%2==1)
{
mapp[x][y]=1;
}
else
{
mapp[x][y]=2;
}
if(check_all(x,y))
{
flag=i;
}
}
if(!flag) puts("Tie");
else
{
if(flag&1) printf("A ");
else printf("B ");
printf("%d\n",flag);
}
return 0;
}
凉宫春日的忧郁
取对数…..
#include <bits/stdc++.h>
const double eps=1e-6;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
double n,m;
cin>>n>>m;
double a=1,b=0;
a=m*log10(n);
for(int i=1; i<=m; ++i)
{
b+=log10(i);
}
if(a-b>=eps)
{
puts("No");
}
else puts("Yes");
}
return 0;
}
Back and Forth
想练一下DFS 结果题意被别人误导…..
#include <bits/stdc++.h>
const double eps=1e-6;
using namespace std;
int a[12],b[12],ans;
int tmp;
map<int,int>mp;
int sum;
void dfs(int now,int p,int pre){
if(now==1){
tmp=ans;
tmp-=a[p];
b[11]=a[p];
a[p]=0;
for(int j=1;j<=11;++j){
if(b[j])dfs(2,j,p);
}
a[p]=b[11];
}
if(now==2){
tmp+=b[p];
a[pre]=b[p];
b[p]=0;
for(int i=1;i<=10;++i){
if(a[i])dfs(3,i,p);
}
b[p]=a[pre];
tmp-=b[p];
}
if(now==3){
tmp-=a[p];
b[pre]=a[p];
a[p]=0;
for(int i=1;i<=11;++i){
if(b[i])dfs(4,i,p);
}
a[p]=b[pre];
tmp+=a[p];
}
if(now==4){
if(!mp[tmp+b[p]]){
mp[tmp+b[p]]=1;
sum++;
}
}
}
int main(){
for(int i=1;i<=10;++i){
scanf("%d",&a[i]);
}
ans=1000;
for(int i=1;i<=10;++i){
scanf("%d",&b[i]);
}
for(int i=1;i<=10;++i){
dfs(1,i,0);
}
printf("%d",sum);
return 0;
}