新生周赛总决赛题解

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;
}
原文地址:https://www.cnblogs.com/shmilky/p/14089003.html