第十五届浙江大学宁波理工学院程序设计大赛(同步赛)

这次是和队友一次小训练,感觉一开始题不是很难,写了8道题了,还是没有觉得有什么明显难度的,现在还没有碰到DP什么的,但是模拟,DFS建树,并查集倒是用了一下,算得上是复习吧...

剩下4道再补;

A-StarCraft(巨水)

题目链接:https://ac.nowcoder.com/acm/contest/303/A

题目大意:中文题

思路:输入输出

AC:

int main()
{
    std::ios::sync_with_stdio(false);
    int n;
    while(cin>>n)
        cout<<1998+n<

B-Fibonacci and Counting(规律)

题目链接:https://ac.nowcoder.com/acm/contest/303/B

题目大意:中文题

思路:找规律,发现每一个都可以推到前面的那个状态

AC:

int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>T)
    {
        while(T--)
        {
            int x;
            cin>>x;
            if(x==1)
                cout<<2<

C-LCPS

题目链接:https://ac.nowcoder.com/acm/contest/303/C

题目大意:英文题,没看,不会

思路:不会

D-Campaign(看成二进制暴力)

题目链接:https://ac.nowcoder.com/acm/contest/303/D

题目大意:中文题

思路:一个七位的二进制数,然后1代表守护,0代表放弃,然后选出能够守护的最多的配合

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
   
#include
#include
#include
    
//#include 
//#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
   
#define ll long long
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=2e4+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
struct Edge{
    int v,w,nxt;
    Edge(int _v=0,int _w=0,int _nxt=0):
    v(_v),w(_w),nxt(_nxt){}
}edge[MAXN<<1];
int head[MAXN],ecnt;
void intt()
{
    clean(head,-1);
    ecnt=0;
}
void add(int u,int v,int w)
{
    edge[ecnt]=Edge(v,w,head[u]);
    head[u]=ecnt++;
}
//-------------------------
struct node{
    ll l,r;
}home[10];
 
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>T)
    {
        while(T--)
        {
            ll sump;
            cin>>sump;
            for(int i=0;i<7;++i)
                cin>>home[i].l>>home[i].r;
            ll ans=0;
            for(int i=0;i<(1<<7);++i)
            {
                //对于每个基地,最小人数满足&&最大人数不超过
                ll remain,minsum=0,maxsum=0,res=0;
                for(int j=0;j<7;++j)
                {
                    if(1&(i>>j))
                    {
                        minsum+=home[j].l;
                        maxsum+=home[j].r;
                        res++;
                    }
                }
                if(minsum<=sump&&maxsum>=sump)
                    ans=max(ans,res);
            }
            cout<

E-Build Pylons(观察水题...)

题目链接:https://ac.nowcoder.com/acm/contest/303/E

题目大意:中文题,很清晰

思路:看样例,然后观察思考发现因为展开需要k时间,所以最后总会在一个地方等待展开,然后中间的过程总会要走的,只要不走回头路,时间是不变的,因此直接从大到小拍一下,然后遍历一遍即可,范围我目测 ll,就直接开 ll 了,

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
  
#include
#include 
#include 
   
//#include  
//#include
#include 
#include 
#include 
#include
#include 
#include
#include 
#include 
using namespace std; 
  
#define ll long long 
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=1e4+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
struct Edge{
	int v,w,nxt;
	Edge(int _v=0,int _w=0,int _nxt=0):
	v(_v),w(_w),nxt(_nxt){}
}edge[MAXN<<1];
int head[MAXN],ecnt;
void intt()
{
	clean(head,-1);
	ecnt=0;
}
void add(int u,int v,int w)
{
	edge[ecnt]=Edge(v,w,head[u]);
	head[u]=ecnt++;
}
//-------------------------
int x[MAXN];
int n,k;


int main()
{
	int T;
	while(cin>>T)
	{
		while(T--)
		{
			cin>>n>>k;
			for(int i=1;i<=n;++i)
			{
				cin>>x[i];
			}
			sort(x+1,x+1+n);
			ll ans=0,res=0;
			if(n==1)
			{
				cout<

F-Pylon Link(并查集||二分)

题目链接:https://ac.nowcoder.com/acm/contest/303/F

题目大意:中文题

思路:1.把所有的点之间连上边,然后并查集找到使这个图联通的那些边,然后找出最长的那一条/2;

           2.二分出正确答案O(n^2 * log(n))的复杂度,我觉得这种方法可以写,但是没有尝试

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
    
#include
#include
#include
     
//#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
    
#define ll long long
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=2e4+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
const double PI=acos(-1.0);
struct Edge{
    int v,w,nxt;
    Edge(int _v=0,int _w=0,int _nxt=0):
    v(_v),w(_w),nxt(_nxt){}
}edge[MAXN<<1];
int head[MAXN],ecnt;
void intt()
{
    clean(head,-1);
    ecnt=0;
}
void add(int u,int v,int w)
{
    edge[ecnt]=Edge(v,w,head[u]);
    head[u]=ecnt++;
}
//-------------------------
struct node{
    int a,b;
    double l;
}line[510*510];
double dots[510][2];
int pre[510];
bool cmp(node a,node b)
{
    return a.l>T)
    {
        while(T--)
        {
            for(int i=0;i<510;++i)
                pre[i]=i;
            int n;
            cin>>n;
            for(int i=1;i<=n;++i)
                cin>>dots[i][0]>>dots[i][1];
            int k=0;
            for(int i=1;i<=n;++i)
            {
                for(int j=i+1;j<=n;++j)
                {
                    line[k].a=i;
                    line[k].b=j;
                    line[k].l=sqrt((dots[i][0]-dots[j][0])*(dots[i][0]-dots[j][0])+(dots[i][1]-dots[j][1])*(dots[i][1]-dots[j][1]));
                    ++k;
                }
            }
            //cout<

G-Rubik's Cube

题目链接:https://ac.nowcoder.com/acm/contest/303/G

题目大意:没写,目测不会

思路:

H-Protoss and Zerg(规律后快速幂)

题目链接:https://ac.nowcoder.com/acm/contest/303/H

题目大意:中文题

思路:找规律发现n个兵有2^n - 1的方案数,但后两个相加,再一直乘下去,注意取模就行了

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
   
#include
#include
#include
    
//#include 
//#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
   
#define ll long long
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=2e4+10;
const int INF=0x3f3f3f3f;
const ll mod=998244353;
 
//ll take(ll a,ll b)
//{
//  ll res=0;
//  while(b)
//  {
//      //cout<>1;
//  }
//  return res;
//}
 
ll quick(ll a,ll n)
{
    //cout<>1;
    }
    //cout<>T)
    {
        while(T--)
        {
            int n;
            cin>>n;
            ll ans=1;
            while(n--)
            {
                ll a,b;
                cin>>a>>b;
                ll ans1=quick(2,a)-1;
                ll ans2=quick(2,b)-1;
                ll res=(ans1+ans2)%mod;
                //cout<

I-Race Sorting(模拟)

题目链接:https://ac.nowcoder.com/acm/contest/303/I

题目大意:中文题

思路:输入,然后遍历三遍,每次输出对应的种类的id

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
   
#include
#include
#include
    
//#include 
//#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
   
#define ll long long
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=2e4+10;
const int INF=0x3f3f3f3f;
const ll mod=998244353;
 
struct node{
    int id;
    char kind[100];
}arr[1010];
int ans[1010];
 
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>T)
    {
        while(T--)
        {
            clean(ans,0);
            int n;
            cin>>n;
            int id;
            char s[100]={'\0'},sot[3][100]={'\0'};
            for(int i=1;i<=n;++i)
                cin>>arr[i].id>>s>>arr[i].kind;
            cin>>s;
            int l=strlen(s),k=0,str=0;
            for(int i=0;i<=l;++i)
            {
                if(s[i]==','||i==l)
                {
                    for(int j=str;j

J-Carrier(巨水)

题目链接:https://ac.nowcoder.com/acm/contest/303/J

题目大意:判断输入的符不符合要求

思路:输入,判断,输出

AC:

int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>T)
    {
        while(T--)
        {
            int a,b,x,y;
            //350 250 6
            cin>>a>>b>>x>>y;
            if(a<350)
                cout<<"You have not enough minerals."<y)
                cout<<"You must construct additional pylons."<

K-Technology Tree(建一棵树遍历)

题目链接:https://ac.nowcoder.com/acm/contest/303/K

题目大意:中文题

思路:输入,从基础建筑当成根节点建棵树,然后遍历一遍这棵树,当前节点的值=当前节点+父节点,然后就是输入输出了

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
   
#include
#include
#include
    
//#include 
//#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
   
#define ll long long
//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
//  register
const int MAXN=2e4+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
 
struct node{
    int a,b;
}arr[MAXN],ans[MAXN];
struct Edge{
    int v,w,nxt;
    Edge(int _v=0,int _w=0,int _nxt=0):
    v(_v),w(_w),nxt(_nxt){}
}edge[MAXN<<1];
int head[MAXN],ecnt;
void intt()
{
    clean(head,-1);
    ecnt=0;
}
void add(int u,int v,int w)
{
    edge[ecnt]=Edge(v,w,head[u]);
    head[u]=ecnt++;
}
 
void dfs(int u)
{
    //cout<<"u:"<>T)
    {
        while(T--)
        {
            intt();
            int n,q;
            cin>>n>>q;
            for(int i=1;i<=n;++i)
                cin>>arr[i].a>>arr[i].b;
            int pre;
            for(int i=2;i<=n;++i)
            {
                cin>>pre;
                add(pre,i,1);
            }
            ans[1].a=arr[1].a;
            ans[1].b=arr[1].b;
            dfs(1);//将它向下走
            while(q--)
            {
                int x;
                cin>>x;
                cout<

L-The Last Stand

题目链接:https://ac.nowcoder.com/acm/contest/303/L

题目大意:没写,

思路:

你可能感兴趣的:(套题)