新生周赛总决赛题解
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\n", T++);
else
printf("Case %d: CXKNB\n", 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;
}