2021-8-12)2021 年百度之星·程序设计大赛 - 初赛三

2021 年百度之星·程序设计大赛 - 初赛三题解
数字游戏

#include<bits/stdc++.h>
using namespace std;
int maxx,minn,ave,n;
void solve()
{
    cin>>n>>maxx>>minn>>ave;
    int a=maxx+(n-1)*minn;
    int b=minn+(n-1)*maxx;
    //ave*=n;
    if(n*ave<=b&&n*ave>=a&&ave>=minn&&ave<=maxx)cout<<"yes"<<endl;
    else cout<<"no"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

网格路径
这道题蛮恶心的,看似简单,但是我用dfs和传纸条那样的dp都写不了

#include <bits/stdc++.h>

using namespace std;

int test, n;
char str[11][11];
bool b[11][11], c[11][11];

int main() {
	scanf("%d", &test);
	for (; test--; ) {
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
			scanf("%s", str[i] + 1);
		if (str[1][1] == '#' || str[n][n] == '#') {
			printf("0\n");
			continue;
		}
		memset(b, false, sizeof(b));
		b[n][n] = true;
		for (int i = n; i; --i)
			for (int j = n; j; --j)
				if (str[i][j] == '.') {
					if (i < n && b[i + 1][j])
						b[i][j] = true;
					if (j < n && b[i][j + 1])
						b[i][j] = true;
				}
		if (!b[1][1]) {
			printf("0\n");
			continue;
		}
		int ans = 1;
		int x = 1, y = 1;
		memset(c, false, sizeof(c));
		for (; x != n || y != n; ) {
			if (y < n && b[x][y + 1])
				y++;
			else
				x++;
			c[x][y] = true;
		}
		c[n][n] = false;
		bool ok = true;
		x = 1, y = 1;
		for (; x != n || y != n && ok; ) {
			if (x < n && b[x + 1][y])
				x++;
			else
				y++;
			if (c[x][y])
				ok = false;
			else
				c[x][y] = true;
		}
		if (ok)
			ans++;
		printf("%d\n", ans);
	}
}


虫族基地

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,t;
int T;
int main(){
    cin>>T;
    while(T--)
    {
        int x1,x2;
        t=0x3f3f3f3f;
        cin>>n>>m>>x1>>x2;
        if(x1==1||x2==m){puts("0");continue;}
        if(x1==x2)t=(n-1)/2;
        else t=(n+abs(x1-x2))/2-1;
        t=min(t,x1-1);
        t=min(t,m-x2);
        t=min(t,n-1);
        cout<<(long long)t*t<<endl;
    }
}

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,t;
int T;
int cnt;
bool vis[100];
bool check(){
    for(int i=2;i<=n;i++)if(vis[i]==0)return false;
    return 1;
}
inline int mo(int u,int i){
    if(i+u<n)return u+i;
    if(i+u==n)return n;
    if(i+u>n)return (i+u)%n;
}
inline int mo2(int u,int i){
    if(u>i)return u-i;
    if(u==i)return n;
    if(u<i)return n+u-i;
}
inline void dfs(int u,int x)
{
    if(x==n){cnt++;return;}
    int a=mo(u,x);
    if(!vis[a])vis[a]=1,dfs(a,x+1),vis[a]=0;
    int b=mo2(u,x);
    if(!vis[b])vis[b]=1,dfs(b,x+1),vis[b]=0;
    
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>T;
    while(T--)
    {
        cin>>n;
        memset(vis,0,sizeof vis);
        vis[1]=1;
        cnt=0;
        dfs(1,1);
        cout<<cnt<<endl;
    
    }
}

我这个代码跟标准答案相比只不过是把取模运算单独包装了出来,居然还是超时了,真的是无理取闹,为了防止被卡常,还是留个心眼吧(dfs的函数尽量封装到dfs函数里面不要拿出来)
所以我一气之下直接预处理全部

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,t;
int T;
int cnt;
bool vis[100];
int ans[100];
bool check(){
    for(int i=2;i<=n;i++)if(vis[i]==0)return false;
    return 1;
}
inline int mo(int u,int i){
    if(i+u<n)return u+i;
    if(i+u==n)return n;
    if(i+u>n)return (i+u)%n;
}
inline int mo2(int u,int i){
    if(u>i)return u-i;
    if(u==i)return n;
    if(u<i)return n+u-i;
}
inline void dfs(int u,int x)
{
    if(x==n){cnt++;return;}
    int a=mo(u,x);
    if(!vis[a])vis[a]=1,dfs(a,x+1),vis[a]=0;
    int b=mo2(u,x);
    if(!vis[b])vis[b]=1,dfs(b,x+1),vis[b]=0;
    
}
int main(){
ans[1]=1,
ans[2]=2,
ans[3]=2,
ans[4]=4,
ans[5]=2,
ans[6]=4,
ans[7]=4,
ans[8]=8,
ans[9]=2,
ans[10]=4,
ans[11]=6,
ans[12]=8,
ans[13]=2,
ans[14]=8,
ans[15]=6,
ans[16]=16,
ans[17]=2,
ans[18]=4,
ans[19]=6,
ans[20]=8,
ans[21]=4,
ans[22]=12,
ans[23]=6,
ans[24]=16,
ans[25]=4,
ans[26]=4,
ans[27]=4,
ans[28]=16,
ans[29]=2,
ans[30]=12,
ans[31]=10,
ans[32]=32,
ans[33]=4,
ans[34]=4,
ans[35]=8,
ans[36]=8,
ans[37]=2,
ans[38]=12,
ans[39]=6,
ans[40]=16,
ans[41]=2,
ans[42]=8,
ans[43]=6,
ans[44]=24,
ans[45]=6,
ans[46]=12,
ans[47]=8,
ans[48]=32,
ans[49]=6,
ans[50]=8,
ans[51]=6,
ans[52]=8,
ans[53]=2,
ans[54]=8,
ans[55]=10,
ans[56]=32,
ans[57]=4,
ans[58]=4,
ans[59]=6,
ans[60]=24,
ans[61]=2,
ans[62]=20,
ans[63]=6,
ans[64]=64,
ans[65]=6,
ans[66]=8,
ans[67]=8,
ans[68]=8,
ans[69]=4,
ans[70]=16,
ans[71]=6,
ans[72]=16,
ans[73]=2,
ans[74]=4,
ans[75]=8,
ans[76]=24,
ans[77]=14,
ans[78]=12,
ans[79]=6,
ans[80]=32;
    cin>>T;
    while(T--)
    {
        cin>>n;
        cout<<ans[n]<<endl;
    }
    // for(int i=2;i<=80;i++){
    //     memset(vis,0,sizeof vis);
    //     vis[1]=1;
    //     cnt=0;
    //     n=i;
    //     dfs(1,1);
    //     printf("ans[%d]=%d,\n",i,cnt);
    // }
}

在这里插入图片描述
直接0秒解决战斗(气死我了!!!





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值