ACM第三周---周训---题目合集.
🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.CSDN
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:ACM周训练题目合集.CSDN
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️为什么我们不知疲倦,因为我们都在做自己所热爱的事 ♐
文章目录
- 🚀write in front🚀
- ✨A - A AtCoder - abc229_a✨
- 💬A题目题解💬
- ✨B - B AtCoder - abc220_b✨
- 💡B题目题解💡
- ✨C - C HDU - 4811✨
- 🎈C题目题解🎈
- ✨D - D OpenJ_NOI - CH0105-31✨
- 💬D题目题解💬
- ✨E - E OpenJ_Bailian - 2888 ✨
- 💡E题目题解💡
- ✨F - F AtCoder - abc239_c✨
- 🎈F题目题解🎈
- ✨G - G HDU - 2032✨
- 💬G题目题解💬
- ✨H - H OpenJ_Bailian - 3253✨
- 💡H题目题解💡
- ✨I - I HDU - 1556 ✨
- 🎈I题目题解🎈
- ✨J - J HDU - 1559 ✨
- 💬J题目题解💬
- 💬💡🎈总结
🚀write in front🚀
✨A - A AtCoder - abc229_a✨
💬A题目题解💬
题意:2*2的矩阵中黑色块为’#',白色块为‘.’,判断矩阵中的黑色块是否连通?
分析:反向思考,不连通的情况只有两种。
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int main()
{
cin >> s1 >> s2;
if((s1=="#."&&s2==".#")||(s2=="#."&&s1==".#"))
puts("No");
else
puts("Yes");
return 0;
}
✨B - B AtCoder - abc220_b✨
题意和分析可以看上一篇哦~
💡B题目题解💡
#include<stdio.h>
#include<math.h>
int main()
{
long long k;
scanf("%lld",&k);
long long a,b,i=0,j=0,sum=0,count=0;
scanf("%lld %lld",&a,&b);
while(a>0)
{
sum+=a%10*pow(k,i++);
a=a/10;
}
while(b>0)
{
count+=b%10*pow(k,j++);
b=b/10;
}
long long c=count*sum;
printf("%lld",c);
return 0;
}
✨C - C HDU - 4811✨
题意:多组输入,每行三个数R,Y,B,分别代表红球数量,黄球数量,蓝球数量,然后每次放一个球,这个球的得分为这个球左边的球的种类+这个球右边球的种类,然后让你求把全部的球放完后的最大的总得分
分析:假设黄球的数量为0,那么其它球放入后,黄球不能够为其他球创造得分,如果黄球数量为1那么黄球放到任意1边就能够为其它颜色的球创造1的得分,如果黄球的数量为2,那么黄球放到两边,其他球放到两个黄球中间,黄球就能够为其它的球创造2分,如果黄球的数量大于2的话其实是和2的效果一样的,最多能创造2分,能想到这里然后就好办了。首先算出来所有球创造的最大得分之和(g),然后每次放1个球,价值从0开始,每次价值加1,直到达到最大可以创造的得分(g),然后算一下剩余的球的个数(h-g),剩余的球只要放就是最大得分,剩余的球创造的得分为(h-g)*g,然后加上之前的球的得分就是答案
🎈C题目题解🎈
#include<stdio.h>
long long fen(long long n)
{
if(n<=2)
{
return n;
}
return 2;
}
int main()
{
long long r,y,b;
while(~scanf("%lld%lld%lld",&r,&y,&b))
{
long long g=fen(r)+fen(y)+fen(b);
long long h=r+y+b;
long long sum=0,i=0;
for(i=0;i<g;i++)
{
sum+=i;
}
if(h>g) sum+=(h-g)*g;
printf("%lld\n",sum);
}
return 0;
}
✨D - D OpenJ_NOI - CH0105-31✨
题意:其实就是0,1问题,0代表什么意思,1代表什么意思
分析:其实就是思维题!
💬D题目题解💬
#include<stdio.h>
int main()
{
int n,m,light[5000]={0};
int i=0,j=0,cnt=0;
scanf("%d",&n);
scanf("%d",&m);
for(i=2;i<=m;i++)
{
for(j=0;j<n;j++)
{
if((j+1)%i==0)
{
light[j]=light[j]==1 ? 0:1;
}
}
}
for(i=0;i<n;i++)
{
if(light[i]==0)
{
cnt++;
}
}
for(i=0;i<n;i++)
{
if(light[i]==0)
{
cnt--;
printf("%d",i+1);
if(cnt!=0) printf(",");
}
}
return 0;
}
✨E - E OpenJ_Bailian - 2888 ✨
题意:按顺序输出数字字符。
分析:开新数组然后冒泡排序。
💡E题目题解💡
#include<stdio.h>
void bulle_sort(int arr[],int n)
{
int i=0;
for(i=0;i<n-1;i++)
{
int j=0;
for(j=0;j<n-i-1;j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main()
{
int n,i,l,t,m,a2[25];
char a[25],a1[25],j[10];
while(gets(a))
{
for(i=0;i<10;i++) j[i]=0;
l=0;
for(i=0;a[i]!='\0';i++)
{
if(a[i]>='0'&&a[i]<=57)
{
a1[l++]=a[i];
}
}
a1[l]='\0';
for(i=0;i<l;i++)
{
a2[i]=(int)(a1[i]-'0');
}
bulle_sort(a2,l);
for(i=0;i<l;i++)
printf("%4c",a2[i]+'0');
printf("\n");
}
return 0;
}
✨F - F AtCoder - abc239_c✨
题意:到(0,0)这个点的长度为根号5的点
分析:枚举+暴力。
🎈F题目题解🎈
#include<stdio.h>
int d[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {-2, -1}, {-1, -2}, {1, 2}, {2, 1}};
int main()
{
int x1, y1, x2, y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
int f=0;
for(int i=0;i<8;i++)
{
int x=x1+d[i][0],y=y1+d[i][1];
if((x2-x)*(x2-x)+(y2-y)*(y2-y)==5) f=1;
}
if(f) puts("Yes");
else puts("No");
return 0;
}
✨G - G HDU - 2032✨
题意:打印杨辉三角。
分析:根据行打印就行。
💬G题目题解💬
#include <stdio.h>
int main()
{
int n,i,j;
int a[30][30];
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
a[i][0]=1;
a[i][i]=1;
for(j=1;j<i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
if(j!=i)
printf("%d ",a[i][j]);
else printf("%d",a[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
✨H - H OpenJ_Bailian - 3253✨
说实话这题博主不会hhh~博主菜菜带带呜呜呜
💡H题目题解💡
#include<stdio.h>
int F(int n,int m)//n个元素,m个子集合
{
if(n<m)
return 0;
else
{
if(n==0||n==m||n==1||m==1)
return 1;
else
return F(n-1,m-1)+m*F(n-1,m);
}
}
int main()
{
int n;
int cnt=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)//n=0时单独讨论
{
printf("1\n");
continue;
}
cnt=0;
int i;
for(i=1;i<=n;i++)
cnt+=F(n,i);
printf("%d\n",cnt);
}
return 0;
}
✨I - I HDU - 1556 ✨
分析:差分问题。
🎈I题目题解🎈
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int main(){
int n,i,sum[100010],a,b;
while(scanf("%d",&n)&&n!=0){
memset(sum,0,sizeof(sum));
for(i=1;i<=n;i++){
scanf("%d%d",&a,&b);
sum[a]++;
sum[++b]--;
}
for(i=1;i<=n;i++){
sum[i]+=sum[i-1];
if(i==1) printf("%d",sum[i]);
else printf(" %d",sum[i]);
}
printf("\n");
}
return 0;
}
✨J - J HDU - 1559 ✨
分析:求二维的差分模板题。
💬J题目题解💬
#include<stdio.h>
#include<string.h>
#include<math.h>
int t,m,n,x,y,a;
long long sum[1010][1010];
long long arr[1010][1010];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&n,&m,&x,&y);
long long res=0;
memset(sum,0,sizeof sum);
memset(arr,0,sizeof arr);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%lld",&arr[i][j]);
sum[i][j]=sum[i][j-1]+arr[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
sum[i][j]+=sum[i-1][j];
if(i>=x&&j>=y)
res=fmax(res,sum[i][j]-sum[i][j-y]-sum[i-x][j]+sum[i-x][j-y]);
}
printf("%lld\n",res);
}
return 0;
}
💬💡🎈总结
1.说实话博主其实也不是全会这些题目,而是自己看了别人大佬的题解才想出来的思路和题解,这里也是分享给大家让大家学习和讨论。
2.写编程题目真的很烧time,当然更烧脑,希望每一位努力奋斗的人都能呈正反馈给到自己。
3.感恩相遇,希望给博主一个三连支持一下,蟹蟹啦~