2018年湘潭大学程序设计竞赛(回顾补题)

A 时间统计

https://ac.nowcoder.com/acm/contest/105/A

直接计算即可

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<stack>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int day1=0,day1h=0,day1m=0,day1s=0;
        int day2=0,day2h=0,day2m=0,day2s=0;
        scanf("%dday%d:%d:%d",&day1,&day1h,&day1m,&day1s);
        scanf("%dday%d:%d:%d",&day2,&day2h,&day2m,&day2s);
        long long sum=(day2-day1)*3600*24;
        sum+=(day2h-day1h)*3600;
        sum+=(day2m-day1m)*60;
        sum+=(day2s-day1s);
        printf("%lld\n",sum);
    }
    return 0;
}

B String

https://ac.nowcoder.com/acm/contest/105/B

直接根据题意模拟即可

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<stack>
using namespace std;
int num1[6][6];
char s1[10][10];
void init()
{
    s1[0][0]='0',s1[0][1]='1',s1[0][2]='2',s1[0][3]='3',s1[0][4]='4',s1[0][5]='5';
    s1[1][0]='6',s1[1][1]='7',s1[1][2]='8',s1[1][3]='9',s1[1][4]='A',s1[1][5]='B';
    s1[2][0]='C',s1[2][1]='D',s1[2][2]='E',s1[2][3]='F',s1[2][4]='G',s1[2][5]='H';
    s1[3][0]='I',s1[3][1]='J',s1[3][2]='K',s1[3][3]='L',s1[3][4]='M',s1[3][5]='N';
    s1[4][0]='O',s1[4][1]='P',s1[4][2]='Q',s1[4][3]='R',s1[4][4]='S',s1[4][5]='T';
    s1[5][0]='U',s1[5][1]='V',s1[5][2]='W',s1[5][3]='X',s1[5][4]='Y',s1[5][5]='Z';
}
int main()
{
    init();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(num1,0,sizeof(num1));
        string s2;
        cin>>s2;
        for(int j=0;j<s2.size();j++)
        {
            switch(s2[j])
            {
                case '0':
                for(int i=0;i<=5;i++)
                    num1[i][0]++;  
                for(int i=0;i<=5;i++)
                    num1[0][i]++;
                        break;
                case '1':
                for(int i=0;i<=5;i++)
                    num1[i][1]++;  
                for(int i=0;i<=5;i++)
                    num1[0][i]++;
                        break;
                case '2':
                for(int i=0;i<=5;i++)
                    num1[i][2]++;  
                for(int i=0;i<=5;i++)
                    num1[0][i]++;
                        break;
                case '3':
                for(int i=0;i<=5;i++)
                    num1[i][3]++;  
                for(int i=0;i<=5;i++)
                    num1[0][i]++;
                        break;
                case '4':
                for(int i=0;i<=5;i++)
                    num1[i][4]++;  
                for(int i=0;i<=5;i++)
                    num1[0][i]++;
                        break;
                case '5':
                for(int i=0;i<=5;i++)
                    num1[i][5]++;  
                for(int i=0;i<=5;i++)
                    num1[0][i]++;
                        break;
                case '6':
                for(int i=0;i<=5;i++)
                    num1[i][0]++;  
                for(int i=0;i<=5;i++)
                    num1[1][i]++;
                        break;
                case '7':
                for(int i=0;i<=5;i++)
                    num1[i][1]++;  
                for(int i=0;i<=5;i++)
                    num1[1][i]++;
                        break;
                case '8':
                for(int i=0;i<=5;i++)
                    num1[i][2]++;  
                for(int i=0;i<=5;i++)
                    num1[1][i]++;
                        break;
                case '9':
                for(int i=0;i<=5;i++)
                    num1[i][3]++;  
                for(int i=0;i<=5;i++)
                    num1[1][i]++;
                        break;
                case 'A':
                for(int i=0;i<=5;i++)
                    num1[i][4]++;  
                for(int i=0;i<=5;i++)
                    num1[1][i]++;
                        break;
                case 'B':
                for(int i=0;i<=5;i++)
                    num1[i][5]++;  
                for(int i=0;i<=5;i++)
                    num1[1][i]++;
                        break;
                case 'C':
                for(int i=0;i<=5;i++)
                    num1[i][0]++;  
                for(int i=0;i<=5;i++)
                    num1[2][i]++;
                        break;
                case 'D':
                for(int i=0;i<=5;i++)
                    num1[i][1]++;  
                for(int i=0;i<=5;i++)
                    num1[2][i]++;
                        break;
                case 'E':
                for(int i=0;i<=5;i++)
                    num1[i][2]++;  
                for(int i=0;i<=5;i++)
                    num1[2][i]++;
                        break;
                case 'F':
                for(int i=0;i<=5;i++)
                    num1[i][3]++;  
                for(int i=0;i<=5;i++)
                    num1[2][i]++;
                        break;
                case 'G':
                for(int i=0;i<=5;i++)
                    num1[i][4]++;  
                for(int i=0;i<=5;i++)
                    num1[2][i]++;
                        break;
                case 'H':
                for(int i=0;i<=5;i++)
                    num1[i][5]++;  
                for(int i=0;i<=5;i++)
                    num1[2][i]++;
                        break;
                case 'I':
                for(int i=0;i<=5;i++)
                    num1[i][0]++;  
                for(int i=0;i<=5;i++)
                    num1[3][i]++;
                        break;
                case 'J':
                for(int i=0;i<=5;i++)
                    num1[i][1]++;  
                for(int i=0;i<=5;i++)
                    num1[3][i]++;
                        break;
                case 'K':
                for(int i=0;i<=5;i++)
                    num1[i][2]++;  
                for(int i=0;i<=5;i++)
                    num1[3][i]++;
                        break;
                case 'L':
                for(int i=0;i<=5;i++)
                    num1[i][3]++;  
                for(int i=0;i<=5;i++)
                    num1[3][i]++;
                        break;
                case 'M':
                for(int i=0;i<=5;i++)
                    num1[i][4]++;  
                for(int i=0;i<=5;i++)
                    num1[3][i]++;
                        break;
                case 'N':
                for(int i=0;i<=5;i++)
                    num1[i][5]++;  
                for(int i=0;i<=5;i++)
                    num1[3][i]++;
                        break;
                case 'O':
                for(int i=0;i<=5;i++)
                    num1[i][0]++;  
                for(int i=0;i<=5;i++)
                    num1[4][i]++;
                        break;
                case 'P':
                for(int i=0;i<=5;i++)
                    num1[i][1]++;  
                for(int i=0;i<=5;i++)
                    num1[4][i]++;
                        break;
                case 'Q':
                for(int i=0;i<=5;i++)
                    num1[i][2]++;  
                for(int i=0;i<=5;i++)
                    num1[4][i]++;
                        break;
                case 'R':
                for(int i=0;i<=5;i++)
                    num1[i][3]++;  
                for(int i=0;i<=5;i++)
                    num1[4][i]++;
                        break;
                case 'S':
                for(int i=0;i<=5;i++)
                    num1[i][4]++;  
                for(int i=0;i<=5;i++)
                    num1[4][i]++;
                        break;
                case 'T':
                for(int i=0;i<=5;i++)
                    num1[i][5]++;  
                for(int i=0;i<=5;i++)
                    num1[4][i]++;
                        break;
                case 'U':
                for(int i=0;i<=5;i++)
                    num1[i][0]++;  
                for(int i=0;i<=5;i++)
                    num1[5][i]++;
                        break;
                case 'V':
                for(int i=0;i<=5;i++)
                    num1[i][1]++;  
                for(int i=0;i<=5;i++)
                    num1[5][i]++;
                        break;
                case 'W':
                for(int i=0;i<=5;i++)
                    num1[i][2]++;  
                for(int i=0;i<=5;i++)
                    num1[5][i]++;
                        break;
                case 'X':
                for(int i=0;i<=5;i++)
                    num1[i][3]++;  
                for(int i=0;i<=5;i++)
                    num1[5][i]++;
                        break;
                case 'Y':
                for(int i=0;i<=5;i++)
                    num1[i][4]++;  
                for(int i=0;i<=5;i++)
                    num1[5][i]++;
                        break;
                case 'Z':
                for(int i=0;i<=5;i++)
                    num1[i][5]++;  
                for(int i=0;i<=5;i++)
                    num1[5][i]++;
                        break;
            }
        }
        int maxn=-1;
        for(int i=0;i<6;i++)
        {
            for(int j=0;j<6;j++)
            {
                if(maxn<num1[i][j])
                    maxn=num1[i][j];
            }
        }
        for(int i=0;i<6;i++)
        {
            for(int j=0;j<6;j++)
            {
                if(maxn==num1[i][j])
                    printf("%c",s1[i][j]);
            }
        }
        printf("\n");
    }
    return 0;
}

C Boom

https://ac.nowcoder.com/acm/contest/105/C

当时比赛没写出,其实对于每一个矩形,通过对于其边界长度的判定,求解出最大值,模拟

#include <cstdio>
#include <algorithm>
  
using namespace std;
  
int x1[55], _y1[55], x2[55], y2[55];
  
int main()
{ 
    int T;
    scanf("%d", &T);
  
    while(T--){
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; i++){
            scanf("%d %d %d %d", &x1[i], &_y1[i], &x2[i], &y2[i]);
        }
        int res = -1;
        for(int x = 0; x <= 100; x++){
            for(int y = 0; y <= 100; y++){
                int cnt = 0;
                for(int i = 0; i < n; i++){
                    if(x > x1[i] && x <= x2[i] && y > _y1[i] && y <=y2[i]){
                        cnt++;
                    }
                }
                res = max(cnt, res);
            }
        }
        printf("%d\n", res);
  
    }
    return 0;
}

D Fibonacci进制

https://ac.nowcoder.com/acm/contest/105/D

首先求解出前50个斐波那契数作为因子,之后根据输入的数N,从小到大遍历,如果大于这一位的因数,就减去,直到结果小于等于0。如果等于0,直接转换即可。否则将其从大到小在相减直到其为0。最后根据1和0从二进制转化为十进制即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
int T;
long long f[50]={0,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,
75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,
63245986,102334155,165580141,267914296,433494437,701408733};
int temp[50];
long long ans;
long long n;
int main()
{
    cin>>T;
    while(T--)
    {
        memset(temp,0,sizeof(temp));
        cin>>n;
        for(int i=1;i<=43;i++)
        {
            temp[i]=1;
            n-=f[i];
            if(n<=0)
                break;
        }
        n=fabs(n);
        for(int i=43;i>=0;i--)
        {
            if(n>=f[i])
            {
                n-=f[i];
                temp[i]=0;
            }
        }
        ans=0;
        for(int i=43;i>=1;i--)
        {
            ans=ans*2+temp[i];
        }
        cout<<ans<<endl;
    }
        
    return 0;
}

E 吃货

https://ac.nowcoder.com/acm/contest/105/E

首先排序,按照价格从大到小的顺序进行排序。之后对于整个的商品进行遍历,求解出当目前为止,小于等于当前价位的美味的最大值数组。用一个单独的数组存放价格,进行二分查找,输出在这个位置上的美味数组的最大值即为答案。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=30000;
long long num[MAXN+11];
struct node{
    long long d,c;
};
vector<node> p;
vector<long long> value1;
bool cmp(node a,node b) {
    return a.d<b.d;
}
int main() {
    int t;
    while(~scanf("%d",&t)) {
        while(t--) {
            int n,m;
            scanf("%d%d",&n,&m);
            p.clear();
            value1.clear();
            for(int i=0;i<n;i++) {
                node temp;
                scanf("%lld%lld",&temp.d,&temp.c);
                p.push_back(temp);
            }
            sort(p.begin(),p.end(),cmp);
            num[0]=p[0].c;
            value1.push_back(p[0].d);
            for(int i=1;i<n;i++) {
                num[i]=max(num[i-1],p[i].c);
                value1.push_back(p[i].d);
            }
            while(m--) {
                long long money;
                scanf("%lld",&money);
                int add1=lower_bound(value1.begin(),value1.end(),money)-value1.begin();
                if(p[add1].d==money)
                    printf("%lld\n",num[add1]);
                else
                    printf("%lld\n",num[add1-1]);
            }
        }
    }
    return 0;
}

F maze

https://ac.nowcoder.com/acm/contest/105/F

搜索题,运用优先队列进行的搜索。对于每次搜索不是按照上下左右的四个顺序,而是按照时间的先后进行搜索,这样就可以解决对于当前的传送点是否进行传送的问题。第一次写先遍历整张图,然后对于每个传送点,排除无法传送的,按照时间先后再进行判定。这样只通过了66.67%的数据,使用优先队列按照时间顺序后可以确定是否能够到达终点并且终点是否最优。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=311;
const int INF=0x3f3f3f3f;
struct Node{
    int x,y,t;
    bool operator < (const Node &e) const{
        return t > e.t;//小
    }
};
int n,m,q;
int startx,starty,endx,endy;
char ch[MAXN][MAXN];
int vis[MAXN][MAXN];
int s[MAXN][MAXN][2];
int next1[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs(){
    priority_queue<Node> pq;
    pq.push({startx,starty,0});
    if(s[startx][starty][0]!=-1)
        pq.push({s[startx][starty][0],s[startx][starty][1],3});
    while(!pq.empty()){
        Node u = pq.top();
        pq.pop();
        if(u.x==endx && u.y==endy){
            printf("%d\n",u.t);
			return;
        }
        int sx = s[u.x][u.y][0],sy=s[u.x][u.y][1];
        if(sx!=-1 && vis[sx][sy]>u.t+3){
            pq.push({sx,sy,u.t+3});//传送
            vis[sx][sy] = u.t+3;
        }
        for(int i=0;i<4;i++){
            int x = u.x + next1[i][0];
            int y = u.y + next1[i][1];
            if(x>=0 && x<n && y>=0 && y<m && ch[x][y]!='#'){
                if(vis[x][y]>u.t+1){
                    vis[x][y] = u.t+1;
                    pq.push({x,y,u.t+1});
                }
            }
        }
    }
    puts("-1");
}
int main(){
    while(~scanf("%d%d%d",&n,&m,&q)){
        memset(vis,INF,sizeof(vis));
        memset(s,-1,sizeof(s));
        getchar();
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++){
                scanf("%c",&ch[i][j]);
                if(ch[i][j]=='S')
                    startx=i,starty=j;
				if(ch[i][j]=='T')
                    endx=i,endy=j;
            }
            getchar();
        }
        for(int i=0;i<q;i++){
            int u,v,uu,vv;
            scanf("%d%d%d%d",&u,&v,&uu,&vv);
			if(ch[u][v]!='#' &&ch[uu][vv]!='#'){
                s[u][v][0]=uu;
                s[u][v][1]=vv;
            }
        }
        bfs();
    }
	return 0;
}

G 又见斐波那契

https://ac.nowcoder.com/acm/contest/105/G

矩阵快速幂(按照数据范围其实我觉得应该会超时......)数据有点水

矩阵构造方法:https://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html

构造方法中第三种情况

最终构造出一个6*6的矩阵

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef vector<LL> vec;
typedef vector<vec> mat;
long long M=1000000007;
mat mul(mat &A,mat &B)
{
    LL r;
    mat C(A.size(),vec(B[0].size()));
    for(int i=0;i<A.size();i++)
        for(int k=0;k<B.size();k++) {
            r = A[i][k];
            for (int j = 0; j < B[0].size(); j++)
                C[i][j] = (C[i][j] + r * B[k][j] + 1000000007) % M;
        }
    return C;
}
mat pow(mat A,LL n)
{
    mat B(A.size(),vec(A.size()));
    for(int i=0;i<A.size();i++) B[i][i]=1;
    while(n>0)
    {
        if(n&1) B=mul(B,A);
        A=mul(A,A);
        n>>=1;
    }
    return B;
}
int main()
{
    long long n;
    int t;
    scanf("%d",&t);
    while(t--) {
        scanf("%lld",&n);
        if(n==1) {
            printf("1\n");
            continue;
        }
        mat A(6,vec(6));//系数
        mat C(1,vec(6));//像鼠标
        A[0][0]=1,A[0][1]=1,A[0][2]=0,A[0][3]=0,A[0][4]=0,A[0][5]=0;
        A[1][0]=1,A[1][1]=0,A[1][2]=0,A[1][3]=0,A[1][4]=0,A[1][5]=0;
        A[2][0]=1,A[2][1]=0,A[2][2]=1,A[2][3]=0,A[2][4]=0,A[2][5]=0;
        A[3][0]=1,A[3][1]=0,A[3][2]=3,A[3][3]=1,A[3][4]=0,A[3][5]=0;
        A[4][0]=1,A[4][1]=0,A[4][2]=3,A[4][3]=2,A[4][4]=1,A[4][5]=0;
        A[5][0]=1,A[5][1]=0,A[5][2]=1,A[5][3]=1,A[5][4]=1,A[5][5]=1;
        C[0][0]=1,C[0][1]=0,C[0][2]=8,C[0][3]=4,C[0][4]=2,C[0][5]=1;
        A=pow(A,n-1);
        C=mul(C,A);
        cout<<C[0][0]<<endl;
    }
    return 0;
}

H 统计颜色

https://ac.nowcoder.com/acm/contest/105/H

线段树----不会,代补

发布了45 篇原创文章 · 获赞 1 · 访问量 6769

猜你喜欢

转载自blog.csdn.net/Ls_attack/article/details/104061874
今日推荐