暑期集训7/16

---恢复内容开始---

A题:

题目要求:求一个环,满足相邻的节点的和为素数,都是一开始

思路:深搜dfs,只到位数等于要求的位数,然后输出,接着回溯,只到所以情况都出来

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};//素数打表
int num[25];
int v[25];
int n;
void dfs(int d)
{
	if(d==n&&prime[num[d]+num[1]])
	{
		for(int i=1;i<n;i++) cout<<num[i]<<" ";
		cout<<num[n]<<endl;
		return ;
	}
	for(int i=2;i<=n;i++)
	{
		if(!v[i]&&prime[num[d]+i])//v数组表示有没有访问过,再判断当前这个i加上num【d】d是表示第d位值的数
		{
			v[i]=1;
			num[++d]=i;
			dfs(d);
			v[i]=0;//回溯
			d--;
		}
	}
}
int main()
{
	for(int i=0;i<=20;i++) num[i]=i;
	int cnt=1;
	while(~scanf("%d",&n))
	{
		memset(v,0,sizeof(v));
		printf("Case %d:\n",cnt++);
		num[1]=1;
		dfs(1);
		cout<<endl;
	}
	return 0;
}

B题目:

C题目:

题目要求:求有多少个连通块(8连通)

思路:bfs

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
int n,m;
char a[105][105];
int dx[]={0,0,1,-1,1,-1,-1,1};
int dy[]={1,-1,0,0,1,-1,1,-1};
void bfs(int x,int y)
{
    a[x][y]=‘*‘;
    for(int i=0;i<8;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=0&&nx<n&&ny>=0&&ny<m)
        {
            if(a[nx][ny]==‘@‘)
            {
                bfs(nx,ny);
            }
        }
    }
}
int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>a[i][j];
            }
        }
        int ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(a[i][j]==‘@‘)
                {
                    //cout<<i<<" "<<j<<endl;
                    bfs(i,j);
                    /*for(int i=0;i<n;i++)
                    {
                        for(int j=0;j<m;j++)
                        {
                            cout<<a[i][j];
                        }
                        cout<<endl;
                    }*/
                    ans++;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

D题:

E题:暴力枚举到最大的数,然后存到数组里,打表

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
int jc(int a)
{
    if(a==0) return 1;
    int ans=1;
    for(int i=a;i>=1;i--) ans*=i;
    return ans;
}
int main()
{
    cout<<1<<endl;
    cout<<2<<endl;
    cout<<145<<endl;
    cout<<40585<<endl;
    return 0;
}

F题:

G题:

H题:

题目要求:#的位置可以放棋子,要让棋子不同行不同列,我们就枚举每一个行,深搜

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
char a[105][105];
int vr[105];
int vl[105];
int v[105][105];
int cnt=0;
int n,m;
void dfs(int x,int d) //遍历到第x行
{
    if(d==m)
    {
        cnt++;
        return;
    }
    if(x>=n) return;
    for(int j=0;j<n;j++)
    {
        if(vl[j]==0&&a[x][j]==‘#‘)//vl表示j列上有没有放东西
        {
            vl[j]=1;
            dfs(x+1,d+1);
            vl[j]=0;
        }
    }
    dfs(x+1,d);//x行算完之后,你接着算x+1行的!!!!!很重要,本题最难的地方
}
int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        cnt=0;
        if(n==-1&&m==-1) break;
        memset(vr,0,sizeof(vr));
        memset(vl,0,sizeof(vl));
        int flag=1;
        int x=105,y=105;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>a[i][j];
                if(a[i][j]==‘#‘&&flag)
                {
                    x=i;
                    flag=0;
                }
            }
        }
        if(flag)
        {
            cout<<"0"<<endl;
            continue;
        }
        dfs(0,0);
        cout<<cnt<<endl;
    }
    return 0;
}

I题:

题目要求:

思路:找规律

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
ll f[36];
int main()
{
    f[1]=2;
    for(int i=2;i<=35;i++)
    {
        f[i]=3*f[i-1]+2;
    }
    int n;
    while(~scanf("%d",&n))
    {
        cout<<f[n]<<endl;
    }
    return 0;
}

J题:

题目要求:S点经过T秒能不能到D

思路:dfs计算所有路线的情况,看看是否有等于T的路,但是如果没有剪枝的话,就会一直TML,

一个矩形

S。。。。

。。。。D

。。。。。

。。。。。

。。。。。

把他们坐标的和为偶数的标为0,奇数的标为1,每个0到1都要奇数步,1到1或者0到0都是偶数步数,就是两个坐标的奇偶性不同,就是奇数步,相同的话就是偶数步,所以如果题目要求的t和SD点的步数奇偶不一样的话就直接NO,还有如果两点的距离大于T的话,也直接NO

代码

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
int n,m,t;
int flag=0;
char a[105][105];
int v[105][105];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void dfs(int x,int y,int d)
{
    if(d==t&&a[x][y]==‘D‘)
    {
        flag=1;
        return;
    }
    if(d>=t) return;
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=0&&nx<n&&ny>=0&&ny<m)
        {
            if(!v[nx][ny]&&a[nx][ny]!=‘X‘)
            {
                v[nx][ny]=1;
                dfs(nx,ny,d+1);
                v[nx][ny]=0;
                if(flag) return;
            }
        }
    }
}
int main()
{
    while(~scanf("%d %d %d",&n,&m,&t))
    {
        flag=0;
        if(n==0&&m==0&&t==0) break;
        int x,y;
        int enx,eny;
        memset(v,0,sizeof(v));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>a[i][j];
                if(a[i][j]==‘S‘)
                {
                    x=i;y=j;
                }
                if(a[i][j]==‘D‘)
                {
                    enx=i;eny=j;
                }
            }
        }
        if(abs(x-enx)+abs(y-eny)>t||(x+y+enx+eny+t)%2==1)
        {
            cout<<"NO"<<endl;
            continue;
        }
        v[x][y]=1;
        dfs(x,y,0);
        if(flag)
        {
            cout<<"YES"<<endl;
        }
        else cout<<"NO"<<endl;
    }
    return 0;
}

K题:

题目要求:就是【key】 value

思路:hash(不会),暴力,map的话会报内存,又学了下stl,string s,

s.find(r) 找s中r的位置,否则返回s.end

s.erase(r,n) 从r这个位置开始,删除n个;

s.substr(l,n) 从l开始长度为n的字符分离出来

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
struct ans
{
    string k,v;
}ans[100010];
int main()
{
    int m,l,r;
    string s,a,b;
    int cnt=1;
    while(getline(cin,s)&&s!="@[email protected]")
    {
        int len=s.size();
        int l,r;
        for(int i=0;i<len;i++)
        {
            if(s[i]==‘[‘)
            {
                l=i;break;
            }
        }
        for(int i=0;i<len;i++)
        {
            if(s[i]==‘]‘)
            {
                r=i;break;
            }
        }
        for(int i=l+1;i<r;i++) a+=s[i];
        for(int i=r+2;i<len;i++) b+=s[i];
        //cout<<a<<" "<<b<<endl;
        ans[cnt].k=a;
        ans[cnt++].v=b;
        a="";b="";
    }
    cin>>m;
    getline(cin,s);
    for(int i=0;i<m;i++)
    {
        int flag=0;
        getline(cin,s);
        int tt=0;
        if(s[0]==‘[‘)
        {
            tt=1;
            s.erase(0,1);
            s.erase(s.size()-1,1);
            for(int i=1;i<cnt;i++)
            {
                if(ans[i].k==s)
                {
                    cout<<ans[i].v<<endl;
                    flag=1;
                    break;
                }
            }
        }
        if(tt==0)
        {
            for(int i=1;i<cnt;i++)
            {
                if(ans[i].v==s)
                {
                    cout<<ans[i].k<<endl;
                    flag=1;
                    break;
                }
            }
        }
        if(!flag) cout<<"what?"<<endl;
    }
    return 0;
}

L题目:

题目要求:n*n的棋盘,放n个棋子,任意两个不能同一行,同一列,同一对角线

其实和H题差不多,就是加上一个对角线的判断,还有一点不用就是他不用枚举每行,因为它的数量是n说明每行都要放棋子的

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#define ll __int64
using namespace std;
int vl[11];
int a[11][11];
int n;
int cnt=0;
bool judge(int r,int l)
{
    for(int i=1;;i++)
    {
        if(r-i<0||l-i<0) break;
        if(a[r-i][l-i]) return false;
    }
    for(int i=1;;i++)
    {
        if(l+i>=n||r+i>=n) break;
        if(a[r+i][l+i]) return false;
    }
    for(int i=1;;i++)
    {
        if(l-i<0||r+i>=n) break;
        if(a[r+i][l-i]) return false;
    }
    for(int i=1;;i++)
    {
        if(l+i>=n||r-i<0) break;
        if(a[r-i][l+i]) return false;
    }
    return true;
}
void dfs(int x,int d)
{
    if(d==n)
    {
        cnt++;
        //cout<<cnt<<endl;
        return ;
    }
    if(x>=n) return;
    for(int j=0;j<n;j++)
    {
        if(!vl[j]&&judge(x,j))
        {
        //    cout<<x<<"  "<<j<<endl;
            vl[j]=1;
            a[x][j]=1;
            dfs(x+1,d+1);
            vl[j]=0;
            a[x][j]=0;
        }
    }
}
int main()
{
    int num[11]={1,1,0 ,0 ,2 ,10 ,4 ,40 ,92 ,352 ,724};
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        /*dfs(0,0);
        cout<<cnt<<endl;*/
        cout<<num[n]<<endl;
    }
    return 0;
}

M题目:

题目要求:输入火车进站的数列,和出站的数列,问是否满足合理的情况

stack题目

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <stack>
#include <vector>
#define ll __int64
using namespace std;
vector<string> ans;
int main()
{
    stack<char> s;
    int n;
    int v[10];
    while(~scanf("%d",&n))
    {
        char a[105];
        char b[105];
        cin>>a>>b;
        s.push(a[0]);
        ans.push_back("in");
        int i=1;
        int len=strlen(a);
        int j=0;
        int flag=1;
        while(!s.empty())
        {
            if(s.size()&&b[j]==s.top())
            {
                s.pop();
                ans.push_back("out");
                if(j==n-1)
                {
                    flag=1;
                    break;
                }
                j++;
                if(!s.size())
                {
                    if(i==n)
                    {
                        flag=0;
                        break;
                    }
                    s.push(a[i]);
                    i++;
                    ans.push_back("in");
                }
            }
            else
            {
                if(i==n)
                {
                    flag=0;
                    break;
                }
                //cout<<a[i]<<endl;
                s.push(a[i]);
                i++;
                ans.push_back("in");
            }
        }
        if(flag)
        {
            printf("Yes.\n");
            for(int i=0;i<ans.size();i++) cout<<ans[i]<<endl;
        }else
        {
            printf("No.\n");
        }
        printf("FINISH\n");
        ans.clear();
        while(s.size()) s.pop();
    }
    return 0;
}

---恢复内容结束---

时间: 2024-10-31 07:10:54

暑期集训7/16的相关文章

2014年CCNU-ACM暑期集训总结

2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训竟然就这样的,溜走了.让自己有点措手不及,更多的是对自己的疑问,自己能否在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结吧. 第一周来的时候,状态还没有融入进去,学长们也不在,就直接布置了一套题目,考察的是贪心策略.学习的时候很有激情,毕竟是期待了那么久的场景,所以大家都很认真,希望自己能够有所进步. 第二周,搜索专题.主要学习宽度优先搜索(BFS)与深度优先搜索(DFS),刚开始学比较吃力,因为自己对这方面的领悟有点迟

第二第三周暑期集训总结

##第二第三周暑期集训总结在第二第三周中,我主要看了状压DP,数位DP,树状DP的主要内容.同时,在做训练赛的过程中,发现一些知识点掌握的不好,于是又回头复习了一下,包括图的一些基本概念,最短路算法,并查集,最小生成树,图的存储方法(矩阵,邻接表(数组)).还有很关键的一件事就是参加了今年的CCPC网络选拔赛.####状压DP刚开始看的时候,我觉得状压DP很难.在恶补了位运算的知识后,我又自己敲了一遍代码,突然有一种茅塞顿开的感觉.这是我对状压DP的理解:状压DP其实也没什么深奥的,就是利用位运

2016暑期集训集中贴

暑假期间网上练习的题解将在此博客公布,具体内容见后文. 题目链接:  点我 以下是暑期集训各队员题量统计(包括赛后补的题) 2016暑期集训AcBoard(截至07-23) 总题量 5 5 7 5   10 10 10 11    63 队员名称 cf-1 cf-2 cf-3 cf-4 cf-5 模拟训练1 模拟训练2 模拟训练3 模拟训练4 模拟训练5 题量小计 cb 2 2 3 3   6 6 6 4   32 fdf 4 3 3 2   5 7 2 4   30  ctr 3 3 3 3

2015年CCNU-ACM暑期集训总结

2015年CCNU-ACM暑期集训总结 本来很早就该做个总结的,可是一直拖到今天,也就是回学校的前一天晚上才下笔,拖延症越来越严重了.为了写这篇总结,我还特意去看了下去年的,映入眼帘的是一道流水账.=_= 往事不堪回首,还是简要说说2015年暑期集训的感想吧. 又是一年暑期集训,大三狗了,还有不到两年学生生涯,想想还蛮伤感的.额,扯远了扯远了.对今年暑期集训呢,其实说实话也没什么感想,唯一的感想就是越来越发现自己弱得一逼.首先说一下多校.多校就是一个让自己受虐的地方,不是那谁说的,要在受虐中成长

题解报告(CDUT暑期集训——第三场)

题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口算法 按着题解的从后往前做(ps:菜是原罪 AC代码 #include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> #incl

SDU暑期集训排位(2)

A. Art solved by sdcgvhgj 3min 签到 B. Biology solved by sdcgvhgj 85min 暴力 C - Computer Science solved by rdc 16min 题意 数轴上有一些点,求极短长度 x,使得存在 \(n\) 个区间,第 \(i\) 个区间包含 \(a_i\),包含的点数至少 \(k\) 个. 做法 每个区间相互独立. 对点排序. 用 \(x_{i+k-1} - x_i + 1\) 区间更新 \([x_i,x_{i+k

2017暑期集训Day 6

T1:华容道 Code: 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #define inf 707406378 8 #define ME 100005 9 #define MN 1505 10 #define len 6005 11 #

2017暑期集训Day 8

T1:LCA Code(倍增): 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<vector> 7 #include<queue> 8 #include<algorithm> 9 using namespace std; 10 vector&

xjtu暑期集训2016-7-9 题解

A 郭铮鹏与国际象棋 B 郭铮鹏与食堂买饭 C 郭铮鹏与烧情侣 D 郭铮鹏与线性代数 E 郭铮鹏与老司机 F GZP and Public Display of Affection G GZP Bureaucracy and Girlfriend H GZP and Dating A. 郭铮鹏与国际象棋 Description 郭铮鹏正在学习国际象棋.他已经学会了王.车和象的移动方式.国际象棋规则如下:棋盘由8行8列共64个格子组成,一个格子的位置通过数对(r,c)来表示,其中r表示行数c表示列