zoukankan      html  css  js  c++  java
  • 新生周赛总决赛题解

    A:CXK的篮球(加强版)

    由于本题数据较大,所以直接暴力会超时(差分我在新生宣讲的时候讲过),可以采用“差分”的算法思想。加一个讲解的链接:https://blog.csdn.net/weixin_43870697/article/details/100862498

    #include <bits/stdc++.h>
    using namespace std;
    const int SIZE = 1e6;
    
    int a[SIZE], c[SIZE * 10];
    long long ans = 0, ask, n, m, x, y, w;
    
    int main()
    {
    	cin >> n >> m;	//输入数列长度和修改次数
    	for (long long i = 1; i <= n; i++) cin >> a[i];	//输入数列
    	for (long long i = 1; i <= m; i++) {
    		cin >> x >> y >> w; //从x到y全部加w
    		c[x] += w;	  //x处标记+w 
    		c[y + 1] -= w; 	  //y+1处标记-w 
    	}
    	cin >> ask;		//输入查询下标 
    	for (long long i = 1; i <= ask; i++) ans += c[i];
    	cout << a[ask] + ans; //不要忘记加原数列值 
    
    	return 0;
    }

    B:CXK想要篮球

    一个贪心的入门题,采用“尽可能多的采用面值较大的硬币”的贪心思想

    #include <bits/stdc++.h>
    using namespace std;
    const int v[6] = { 1,5,10,50,100,500 };
    int c[6];
    int main()
    {
    	int A;
    	int ans = 0;
    	for (int i = 0; i < 6; i++)
    		cin >> c[i];
    	cin >> A;
    	for (int i = 5; i >= 0; i--) {
    		int t = min(A / v[i], c[i]);
    		A -= t * v[i];
    		ans += t;
    	}
    	cout << ans << endl;
    	return 0;
    }

    C:Help Me!!!!!!

    一个基本的模拟题但是代码量巨大,需要认真看题。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    char t[50];
    char a[15][50];
    int main()
    {
        for(int i=1;i<=8;++i)
        {
            scanf("%s",&t);
            scanf("%s",(a[i]+1));
        }
        scanf("%s",&t);
     
     
        int bn=0,wn=0;
        for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
        {
            if('a'<=a[i][j]&&a[i][j]<='z')
                bn++;
            else if('A'<=a[i][j]&&a[i][j]<='Z')
                wn++;
        }
        cout<<"White: ";
        int wcnt=1;
        for(int i=8;i>=1;--i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='K')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<'K'<<c<<(9-i);
                            if(wcnt<wn)
                                cout<<',';
                            else
                                cout<<endl;
     
                        wcnt++;
                    }
            }
     
        for(int i=8;i>=1;--i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='Q')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<'Q'<<c<<(9-i);
                            if(wcnt<wn)
                                cout<<',';
                            else
                                cout<<endl;
     
                        wcnt++;
                    }
            }
        for(int i=8;i>=1;--i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='R')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<'R'<<c<<(9-i);
                            if(wcnt<wn)
                                cout<<',';
                            else
                                cout<<endl;
     
                        wcnt++;
                    }
            }
        for(int i=8;i>=1;--i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='B')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<'B'<<c<<(9-i);
                            if(wcnt<wn)
                                cout<<',';
                            else
                                cout<<endl;
     
                        wcnt++;
                    }
            }
        for(int i=8;i>=1;--i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='N')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<'N'<<c<<(9-i);
                            if(wcnt<wn)
                                cout<<',';
                            else
                                cout<<endl;
     
                        wcnt++;
                    }
            }
     
     
        for(int i=8;i>=1;--i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='P')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(wcnt<wn)
                                cout<<',';
                            else
                                cout<<endl;
                        wcnt++;
                    }
            }
        cout<<"Black: ";
        int bcnt=1;
        for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='k')
                    {
                        cout<<'K';
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(bcnt<bn)
                                cout<<',';
                            else
                                cout<<endl;
                        bcnt++;
                    }
            }
        for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='q')
                    {
                        cout<<'Q';
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(bcnt<bn)
                                cout<<',';
                            else
                                cout<<endl;
                        bcnt++;
                    }
            }
        for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='r')
                    {
                        cout<<'R';
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(bcnt<bn)
                                cout<<',';
                            else
                                cout<<endl;
                        bcnt++;
                    }
            }
            for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='b')
                    {
                        cout<<'B';
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(bcnt<bn)
                                cout<<',';
                            else
                                cout<<endl;
                        bcnt++;
                    }
            }
            for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='n')
                    {
                        cout<<'N';
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(bcnt<bn)
                                cout<<',';
                            else
                                cout<<endl;
                        bcnt++;
                    }
            }
            for(int i=1;i<=8;++i)
            for(int j=3;j<=32;j+=4)
            {
                if(a[i][j]=='p')
                    {
                        char c= (char)(((j+1)/4)+96);
     
                            cout<<c<<(9-i);
                            if(bcnt<bn)
                                cout<<',';
                            else
                                cout<<endl;
                        bcnt++;
                    }
            }
    }

    D:抓牛

    BFS的基础题

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <ctype.h>
    #include <cstring>
    #include <cstdio>
    #include <sstream>
    #include <cstdlib>
    #include <iomanip>
    #include <string>
    #include <queue>
    using namespace std;
    const int inf = 0x3f3f3f3f;
    int n,k;
    queue<int>q;
    int flag[100002];
    int bfs()
    {
        q.push(n),
        flag[n]=1;
        while(!q.empty()){
            int date=q.front();
            int b;
            q.pop();
            for(int i=1;i<=3;i++){
                if(i==1)
                    b=date+1;
                else if(i==2)
                    b=date-1;
                else if(i==3)
                    b=date*2;
                if(b>=0&&b<=100001&&!flag[b]){
                    q.push(b);
                    flag[b]=flag[date]+1;
                    if(b==k)
                        return flag[b]-1;
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d %d",&n,&k)){
            if(n>=k)
                cout<<n-k<<endl;
            else
                cout<<bfs()<<endl;
        }
        return 0;
    }

    E:游戏

    nim博弈, 将灰色和白色棋子之间的距离看作是石头的数量, 可以转化成简单的nim博弈, 直接以后求解。

    #include <bits/stdc++.h>
    #define maxn 10005
    #define INF 0x3f3f3f3f
    typedef long long ll;
    using namespace std;
    int main()
    {
    	int n;
    	int t, T = 1;
    	cin >> t;
    	while (t--) {
    		cin >> n;
    		int ans = 0;
    		for (int i = 0; i < n; i++) {
    			int x, y;
    			cin >> x >> y;
    			ans ^= (y - x - 1);
    		}
    		if (ans == 0)
    			printf("Case %d: AWNB
    ", T++);
    		else
    			printf("Case %d: CXKNB
    ", T++);
    	}
    	return 0;
    }

    F:读书

    思维题,假如n为45,m为5,那么在1~45这个范围内,5的倍数为:5,10,15,20,25,30,35,40,45,再来看这些数的个位数,分别是:5,0,,5,0,5,0,5,0,5。发现规律了没有!5,0循环重复出现!循环的长度为2。所以问题就有了突破口,使用for循环(这个循环最多有n/m次)查找m的倍数,然后开一个数组记录每次出现的个位数,同时声明一个变量len来记录这个循环长度并计算这些个位数之和存到sum中,当某个数字重复出现时就退出for循环。接下来就是计算能有多少个这样的循环,计算出次数并乘以刚刚计算出来的sum,并将这个数值赋给sum.可能这时候还有漏网之鱼,就像上面举的例子里面的最后一个5,这时候就要将构不成一个个位数出现规律循环的数加在sum中,然后输出。分析结束

    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    long long int n,m;    //n为书的页数,m表示每读m页就记录一次个位数
    int q;     //总循环的次数
    int i,j;  //控制循环
    int s[50];   //记录循环过的数据 
    int a[50];   //记录循环过的次数
    int  main()
    {
      cin>>q;
      while(q--){
        memset(s,0,sizeof(s));  //初始化数组,每循环一次就要清空一下数组,要不然就凉了
        memset(a,0,sizeof(a));  //初始化数组
        long long int sum=0;   //记录数据之和
        int temp=0;    //记录个位数
        int len=0;    //记录循环的长度
        cin>>n>>m;
        long long int cs=n/m;  //cs表示共可循环多少次
        if(m>n)
        {
          cout<<0<<endl;
          continue;
        }
        else{
            for(i=1;i<=cs;i++){
              temp=(m*i)%10;
              s[i]=temp;
              a[temp]++;
              if(a[temp]==2)
               break;
              sum+=temp;
              len++;
            }
        }
        sum*=(cs/len);
        if(cs/len!=0){
          for(i=1;i<=cs%len;i++)
           sum+=s[i];
        }
        cout<<sum<<endl;
      }
      return 0;
    }
    

    G:买东西

    n道菜,选出最贵的,放到最后买,然后在保留5元的情况下,用n-5元买剩下的才转化为背包问题。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e4 + 7;
    const int INF = 0x3f3f3f3f;
    int value[maxn], size1[maxn], dp[maxn];
    int main()
    {
    	int n;
    	while (cin >> n && n != 0) {
    		memset(dp, 0, sizeof(dp));
    		int x;
    		for (int i = 1; i <= n; i++)
    			cin >> value[i];
    		cin >> x;
    		if (x < 5) {
    			cout << x << endl;
    			continue;
    		}
    		sort(value + 1, value + 1 + n);
    		for (int i = 1; i < n; i++) {
    			for (int j = x - 5; j >= value[i]; j--)
    				dp[j] = max(dp[j], dp[j - value[i]] + value[i]);
    		}
    		cout << x - dp[x - 5] - value[n] << endl;
    	}
    	return 0;
    }

    H:x的n次幂

    快速幂的模板题

    #include <bits/stdc++.h>
    using namespace std;
    long long QuickPow(int x, int N)
    {
    	int res = x;
    	int ans = 1;
    	while (N)
    	{
    		if (N & 1)
    		{
    			ans = ans * res % 1000;
    		}
    		res = res * res % 1000;
    		N = N >> 1;
    	}
    	return ans % 1000;
    }
    int main()
    {
    	int t;
    	cin >> t;
    	while (t--) {
    		int x, n;
    		cin >> x >> n;
    		cout << QuickPow(x, n) << endl;
    	}
    	return 0;
    }
  • 相关阅读:
    网络基本功(一)细说网络传输
    关于指针的理解
    百度地图定位,标注以及地图中心点问题
    ios 将彩色照片转化成黑白等几种类型
    在 iOS 应用中直接跳转到 AppStore 的方法
    ios中判断当前手机的网络状态
    NTFS 读写高手进阶 Windows 格式硬盘 Mac存文件 开启 ...(转载)
    tableviewcell 中使用autolayout自适应高度
    ios 3D Touch功能的实现
    一些牛人分享的ios技巧,保留着
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089003.html
Copyright © 2011-2022 走看看