2020年SWPUACM团队新生第四次周赛(题解)

说好了是新生周赛,一群大二的来凑什么热闹…
还有就是题都不难,但是大一们做的都有点难受…

A我是签到题

记得开long long,如果矩形长大于等于宽的三倍,则正方形边长最长为宽;反之,正方形 边长最长为
max( 宽/2,长/3)

#include<iostream>
using namespace std;
typedef long long ll;
int main(){
    ll a,b;
    scanf("%lld%lld",&a,&b);
    if(a>=b*3) printf("%lld\n",b);
    else printf("%lld\n",max(b/2,a/3));
    return 0;
}

B喜欢做题的fanfan

贪心,取做题用时最少的。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6;
int a[maxn];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        if(m<a[i])
        {
            printf("%d\n",i-1);
            return 0;
        }
        else
            m-=a[i];
    }
    printf("%d\n",n);
    return 0;
}

C A+B

模拟,记得开long long ,+号仅有一个,不能出现在两端。把+号左右两边字符串转换成long long整型,
最后相加

#include<iostream>
using namespace std;
typedef long long ll;
ll n,zuo,you;
char p[1000];
int main(){
	scanf("%d",&n);
	scanf("%s",p);
	if(p[0]=='+'||p[n-1]=='+'){
		printf("kexi\n");
		return 0;
	}
	int k=0; 
	for(int i=0;i<n;i++){
		if(p[i]=='+'){
			k++;
			if(k>1){
				printf("kexi\n");
				return 0;
			} 
			continue;
		}
		if(k==0){
			zuo*=10;
			zuo+=p[i]-'0';
		}
		else {
			you*=10;
			you+=p[i]-'0';
		} 
	}
	printf("%lld\n",zuo+you);
	return 0;
}

D硬币的翻转小游戏

模拟,假设字符串为s1,s2.现在s1不动,我们只翻转s2,如果当前位置s1[i]跟s2[i]不相等就进行翻转,最
后再判断一下s1[len-1]跟s2[len-1]是否相等,相等有解,不相等无解

#include <stdio.h>
#include <string.h>
char str1[1005],str2[1005];
int cnt = 0;
int main() {
	scanf("%s%s",str1,str2);
     int len=strlen(str1);
	for(int i = 0; i < len; i ++) {
		if(str1[i] != str2[i]) {
			if(str1[i] == '*') {
				//str1[i] = 'o';
				if(str1[i + 1] == '*') 
					str1[i + 1] = 'o';
				else 
					str1[i + 1] = '*';
			} 
			else{
				if(str1[i + 1] == '*') 
					str1[i + 1] = 'o';
				else 
					str1[i + 1] = '*';
				}
				cnt++;
		}
	}
	if(str1[len - 1] == str2[len - 1])
	printf("%d",cnt);
    else 
	printf("No Answer.\n");
	return 0;
}


E吃糖果咯

贪心,努力吃现在这一堆就可以让后面少吃

//贪心,努力吃现在这一堆就可以让后面少吃 
#include<iostream> 
#include<cstdio>
using namespace std;
int  n,m,ans,del,nex,now;//now表示当前输入,nex表示前一堆糖果数量,del表示如果,前一堆糖果数量(nex) + 当前数量(now) > m,则需要吃掉的糖果数量 ;反正小于m,则不需要吃 
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&now);
        del=max((now+nex-m),0);
        nex=now-del;
        ans+=del;//ans累加吃掉的糖果数量del 
    }
    printf("%d\n",ans);
    return 0;
}

F附加题

DFS模板题

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 57, M = N * N;
char g[N][N];
int n, m;
int sx, sy;
bool vis[N][N];
int ans;

const int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};

void dfs(int x, int y){
    vis[x][y] = true;
    for(int i = 0;i < 4;++ i){
        int a = x + dx[i];
        int b = y + dy[i];
        if(a < 0 || b < 0 || a >= n || b >= m)continue;
        if(vis[a][b])continue;
        if(g[a][b] == '#')continue;
        
        
        ans ++ ;
        dfs(a, b);
        
    }
}

int main(){
    while(scanf("%d%d", &m, &n) != EOF && n && m){
        ans = 0;
        memset(vis,0,sizeof vis);
        
        for(int i = 0;i < n; ++ i)
        scanf("%s", &g[i]);
        for(int i = 0;i < n; ++ i)
        for(int j = 0;j < m; ++ j)
        if(g[i][j] == '@')ans = 1, dfs(i, j);
        printf("%d\n", ans);
        
    }
    return 0;
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页