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

这次是和队友一次小训练,感觉一开始题不是很难,写了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<<endl;
     
}

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<<endl;
            else
                cout<<x+1<<endl;
        }
    }
     
}

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<stdio.h>
#include<string.h>
#include<math.h>
    
//#include<map> 
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
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<<ans<<endl;
        }
    }
}

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

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

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

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

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
  
#include<stdio.h>
#include<string.h> 
#include<math.h> 
   
//#include<map>  
//#include<set>
#include<deque> 
#include<queue> 
#include<stack> 
#include<bitset>
#include<string> 
#include<fstream>
#include<iostream> 
#include<algorithm> 
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<<k<<endl;
				continue;
			}
			for(int i=2;i<=n;++i)
				ans+=(x[i]-x[i-1])*(x[i]-x[i-1]);
			ans+=k;
			cout<<ans<<endl;
		}
	}
}

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<stdio.h>
#include<string.h>
#include<math.h>
     
//#include<map>
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
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<b.l;
}
 
int find(int a)
{
    int e=a;
    while(pre[a]!=a)
        a=pre[a];
    int up=e;
    while(pre[e]!=a)
    {
        e=pre[e];
        pre[up]=a;
        up=e;
    }
    return a;
}
 
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>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<<k<<endl;
            sort(line,line+k,cmp);
            int ans=0;
            //cout<<"get_ans:"<<endl;
            for(int i=0;i<k;++i)
            {
                //cout<<i<<endl;
                if(find(line[i].a)!=find(line[i].b))//任意一个没有被标记
                {
                    pre[find(line[i].a)]=find(line[i].b);
                    int res=ceil(line[i].l/2);
                    //cout<<line[i].a<<" "<<line[i].b<<" "<<res<<endl;
                    ans=max(ans,res);
                }
            }
            cout<<ans<<endl;
        }
    }
}

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<stdio.h>
#include<string.h>
#include<math.h>
    
//#include<map> 
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
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<<b<<endl;
//      //cout<<res<<endl;
//      if(b&1)
//          res=(res+a)%mod;
//      a=(a+a)%mod;
//      b=b>>1;
//  }
//  return res;
//}
 
ll quick(ll a,ll n)
{
    //cout<<a<<" "<<n<<endl;
    ll res=1;
    while(n)
    {
//      cout<<n<<endl;
//      cout<<res<<endl;
        if(n&1)
            res=(res*a)%mod;
        a=(a*a)%mod;
//          res=take(res,a)%mod;
//      a=take(a,a)%mod;
        n=n>>1;
    }
    //cout<<res<<endl;
    return res;
}
 
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>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<<res<<" "<<ans1<<" "<<ans2<<endl;
                ans=(ans*res)%mod;
                //ans=take(ans,res)%mod;
            }
            cout<<ans<<endl;
        }
    }
     
}

I-Race Sorting(模拟)

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

题目大意:中文题

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

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
   
#include<stdio.h>
#include<string.h>
#include<math.h>
    
//#include<map> 
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
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<i;++j)
                        sot[k][j-str]=s[j];
                    str=i+1;
                    ++k;
                }
            }
//          cout<<s<<endl;
//          for(int i=0;i<3;++i)
//              cout<<strlen(sot[i])<<" "<<sot[i]<<" "<<sot[i][0]<<endl;
//         
            k=0;
            for(int i=0;i<3;++i)
            {
                for(int j=1;j<=n;++j)
                {
                    if(strcmp(arr[j].kind,sot[i])==0)
                        ans[k++]=arr[j].id;
                }
            }
            cout<<ans[0];
            for(int i=1;i<k;++i)
                cout<<" "<<ans[i];
            cout<<endl;
        }
    }
     
}
  

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."<<endl;
            else if(b<250)
                cout<<"You require more vespene gas."<<endl;
            else if(x+6>y)
                cout<<"You must construct additional pylons."<<endl;
            else
                cout<<"Carrier has arrived."<<endl;
        }
    }
     
}

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

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

题目大意:中文题

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

AC:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
   
#include<stdio.h>
#include<string.h>
#include<math.h>
    
//#include<map> 
//#include<set>
#include<deque>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#include<fstream>
#include<iostream>
#include<algorithm>
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:"<<u<<endl;
    for(int i=head[u];i+1;i=edge[i].nxt)
    {
        int temp=edge[i].v;
         
        int a=ans[u].a,b=ans[u].b;
        ans[temp].a=arr[temp].a+a;
        ans[temp].b=arr[temp].b+b;
        //cout<<"temp:"<<temp<<"ans.a  .b :"<<ans[temp].a<<" "<<ans[temp].b<<endl;
        dfs(temp);
    }
}
 
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    while(cin>>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<<ans[x].a<<" "<<ans[x].b<<endl;
            }
             
        }
    }
     
}
  

L-The Last Stand

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

题目大意:没写,

思路:

猜你喜欢

转载自blog.csdn.net/qq_40482358/article/details/84931634