problem1:
作为大一小白,第一次看到这么多符号直接吓懵,后来不知怎的,回头一看这题so easy
题目要求方便管理度越大越好,并且还要分组。
要这样的话就把每个组里分一个最大的和最小的不就可以达成最大的方便管理度吗,,
举个栗子:
5个人分2组;要求2组方便管理度的和的最大值,不就是每一组都要达到最大值吗,既然每一组都要达到最大值,那就是把5个人的能力排序,分别用最大减去最小。
#include<iostream>#include<algorithm>using namespace std;//c++小白,宏定义不熟练,就傻傻地打long long a[10000000],i,max,min,n,k,result[10000000],j,sum=0;int main(){ scanf("%lld %lld",&n,&k); for(i=0;i<n;i++) { scanf("%lld",&a[i]); } sort(a,a+n); //从小到大排序 for(i=0,j=0;j<k;j++) { result[j]=a[n-1-i]-a[i]; //用每一次去掉数组中最大项和最小项剩下来的数进行操作 i++; sum+=result[j]; } printf("%lld",sum);}
problem2:坐电梯
认证看题,直接上代码:
#include<stdio.h>#include<math.h>int a[1000010];int main(){ int n,k,h; scanf("%d %d",&n,&k); int i,t,j; for(i=0;i<n;i++) { scanf("%d",&a[i]); } int max=a[0]; for(j=1;j<n;j++) { if(a[j]>max) { max=a[j]; } } printf("%d",max-1+max-k);}
problem3:扫雷(数组较小n<1000,m<1000,所以过了)
#include<stdio.h>int main(){ int m,n,i,j,b[1010][1010],cnt=0; char a[1010][1010]; scanf("%d %d",&n,&m); getchar(); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%c",&a[i][j]); } getchar(); } for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(a[i][j]=='.') { //8个方向分别讨论,如果有雷直接计数器++; //防止i,j的边界情况,不知道有没有用,以防万一所以我写了; if(i-1>=0&&i-1<n&&j-1>=0&&j-1<m&&a[i-1][j-1]=='*')cnt++; if(i-1>=0&&i-1<n&&j>=0&&j<m&&a[i-1][j]=='*')cnt++; if(i-1>=0&&i-1<n&&j+1>=0&&j+1<m&&a[i-1][j+1]=='*')cnt++; if(i>=0&&i<n&&j-1>=0&&j-1<m&&a[i][j-1]=='*')cnt++; if(i>=0&&i<n&&j+1>=0&&j+1<m&&a[i][j+1]=='*')cnt++; if(i+1>=0&&i+1<n&&j-1>=0&&j-1<m&&a[i+1][j-1]=='*')cnt++; if(i+1>=0&&i+1<n&&j>=0&&j<m&&a[i+1][j]=='*')cnt++; if(i+1>=0&&i+1<n&&j+1>=0&&j+1<m&&a[i+1][j+1]=='*')cnt++; //8个方向都查看过之后打印地雷数量; printf("%d",cnt); cnt=0; //计数器归零; } //如果扫描到该位置就是地雷,打印*标记地雷; else if(a[i][j]=='*') { printf("*"); } } printf("
"); //换行; }}