第十七届中国计量大学程序设计竞赛

B:Broken Pad

  • 题意:给定两个字符串a,b,要求用最少次数将字符串a变成b,改变的操作有两种,第一种将整个字符串的字符变为0,第二种选定一个位置,从此位置开始的所有字符反向(1->0, 0->1)
  • 思路:分成两钟情况比较,第一种情况不使用操作一,从左往右遍历字符串,遇到不同的字符即翻转,其中要统计一下每个位置的翻转次数,由于从左往右翻转所以只需要一个变量统计即可,第二钟情况先使用操作一将字符变成0串,然后和第一种情况一样操作,最后比较两种情况哪个的步骤少,输出哪种情况
#include <bits/stdc++.h>
using namespace std;
#define ll long long

char a[100010], b[100010];
int main()
{
	int t; scanf("%d", &t);
	while(t--) {	
		scanf("%s %s", a, b);
		int l = strlen(a);
		vector<int>c1,c2;
		c2.push_back(0);
		int cnt = 0;
		for(int i = 0; i < l; i++) {
			if(cnt%2==1&&a[i]==b[i]) {
				cnt++;
				c1.push_back(i+1);
			}else if(cnt%2==0&&a[i]!=b[i]) {
				cnt++;
				c1.push_back(i+1);
			}
		}
		cnt = 0;
		for(int i = 0; i < l; i++) {
			if(cnt%2==1&&b[i]=='0') {
				cnt++;
				c2.push_back(i+1);
			}else if(cnt%2==0&&b[i]!='0') {
				cnt++;
				c2.push_back(i+1);
			}
		}
		if(c1.size()<c2.size()) {
			for(int i = 0; i < (int)c1.size(); i++) {
				if(i!=0) printf(" ");
				printf("%d", c1[i]);
			}
		}else {
			for(int i = 0; i < (int)c2.size(); i++) {
				if(i!=0) printf(" ");
				printf("%d", c2[i]);
			}
		}
		printf("\n");
	}
	return 0;
}

C:Cook Steak

  • 题意:有n个食物需要烤,每个食物烤的时候有个温度范围,只有在这个温度范围内才能烤,烤箱温度自行控制,可以升高降低,每变化一度耗时一分钟,烤制时间一分钟,问按照顺序烤制,最短需要多少分钟
  • 思路:分成三种情况,当前温度小于烤制温度范围,时间加上升高温度*1,再加上一分钟烤制时间,当前温度可以烤制,时间加上一分钟烤制时间,当前温度大于烤制温度范围,时间加上降低温度 * 1,再加上一分钟烤制时间`
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll l[100010], r[100010];
int main()
{
	int t; scanf("%d", &t);
	while(t--) {
		int n; scanf("%d", &n);
		for(int i = 1; i <= n; i++) scanf("%lld %lld", &l[i], &r[i]);
		ll tem = 0;
		ll ans = 0;
		for(int i = 1; i <= n; i++) {
			if(tem<l[i]) {
				ans += (l[i]-tem+1);
				tem = l[i];
			}else if(tem>r[i]) {
				ans += (tem-r[i]+1);
				tem = r[i];
			}else {
				ans++;
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
}

D:Dessert Time

  • 题意:有n个数,两个人轮流取数,每次取的数必须大于等于上一回取的数,当取到最后一个数的时候,如果没有其他数,取到最后一个数的人输,反之赢,问先手能否赢,赢输出第一个取的数,输则输出-1
  • 思路:博弈题,分类讨论,具体看代码注释
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int s[100010];
int main()
{
	int t; scanf("%d", &t);
	while(t--) {
		int n; scanf("%d", &n);
		for(int i = 0; i < n; i++) scanf("%d", &s[i]);
		map<int,int>q;
		for(int i = 0; i < n; i++) q[s[i]]++;
		sort(s,s+n);
		int maxn1 = s[n-1];     // 最大数
		int cnt1 = q[s[n-1]];	// 最大数个数
		int maxn2 = 0;			// 次大数
		int cnt2 = 0;			// 次大数个数
		for(int i = 0; i < n; i++) {
			if(s[i]==maxn1) continue;
			maxn2 = max(s[i],maxn2);
		}
		cnt2 = q[maxn2];
		if(cnt1==n) {  // 只包含一种数
			if(n%2==1) {
				printf("-1\n");
			}else {
				printf("%d\n", maxn1);
			}
		}else {
			if(cnt1%n==1) {  // 最大数个数为奇数,并且存在其他数
				printf("%d\n", maxn1);
			}else {
				int ans = 0;
				// 从大到小找到一个出现的个数为奇数的数
				for(map<int,int>::iterator it = q.begin(); it != q.end(); it++) {
					if(it->second%2==1) ans = it->first;
				}
				if(ans==s[0]) {		// 该数为最小的数
					printf("-1\n");
				}else if(ans==0){	// 不存在奇数个数的数
					printf("%d\n", s[0]);
				}else {		
					printf("%d\n", ans);
				}
			}
		}

	}
	return 0;
}

F: Flag Scramble Competition

  • 题意:输出题目描述中出现次数最多的字母
  • 思路:读入字符串,用map统计字母个数 (代码是找字母用的)
#include <bits/stdc++.h>
using namespace std;
#define ll long long;

int main()
{
	map<char,int>q;
	char s[10010];
	while(~scanf("%s", s)) {
		int l = strlen(s);
		strlwr(s);  // 将字母转为小写
		for(int i = 0; i < l; i++) {
			if(s[i]>='a'&&s[i]<='z') {
				q[s[i]]++;
			}
		}
	}
	int maxn = 0;
	char ans;
	for(map<char,int>::iterator it = q.begin(); it != q.end(); it++) {
		if(maxn<it->second) {
			maxn = it->second;
			ans = it->first;
		}
	}
	printf("%c\n", ans);
	return 0;
}

H:Happy Time is Always Short

  • 题意:给定n个数,m个区间,每次一个下标区间的数被移出数组,问剩下的数中最大的数
  • 思路:将每个数的下标和数值存成一个结构体,并且按从权值从大到小排序,用一个数组记录每个数被选择移出的最大范围,当跑到这个数的时候可以直接跳过中间已经选择的数,另外用一个标记标记最大数,按照结构体的排序顺序遍历是否被移除,最后输出
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct node
{
	int x, p;
}s[100010];
int vis[100010];

bool cmp(node a, node b)
{
	return a.x > b.x;
}

int main()
{
	int t; scanf("%d", &t);
	while(t--) {
		memset(vis,0,sizeof(vis));
		int n, m; scanf("%d %d", &n, &m);
		for(int i = 1; i <= n; i++) {
			scanf("%d", &s[i].x);
			s[i].p = i;
		}
		sort(s+1,s+1+n,cmp);
		int cnt = 1;
		while(m--) {
			int l, r; scanf("%d %d", &l, &r);
			for(int i = l; i <= r; i++) {
				if(vis[i]==0) {
					vis[i] = r;
				}else {
					int num = vis[i];
					vis[i] = max(vis[i],r);
					i = num;
				}
			}
			while(cnt<=n&&vis[s[cnt].p]) cnt++;
			if(cnt>n) {
				printf("0\n");
			}else {
				printf("%d\n", s[cnt].x);
			}
		}
	}
	return 0;
}

I:Isolated Pointset

  • 题意:给n个点,询问是否存在两个点所形成的垂直平分线经过第三个点
  • 思路:至少需要三个点,三个点组成的等边三角形即可,因此点数大于等于3即可
#include <bits/stdc++.h>
using namespace std;
#define ll long long;

int main()
{
	int t; scanf("%d", &t);
    while(t--) {
        int n; scanf("%d", &n);
        if(n<3) {
            printf("No\n");
        }else {
            printf("Yes\n");
        }
    }
	return 0;
}

K:Known-Well Palindrome Date-Easy Version

  • 题意:给定不定个数的身份证号码,问每行给定的每个身份证中存在长度为8的回文串且为合法日期的个数的总和
  • 思路:统计一下即可,判断是否为回文的时候要判是否为空格
#include <bits/stdc++.h>
using namespace std;
#define ll long long
char s[100010];
int day[20] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int jud(int l, int r)
{
	int cnt = 0;
	int a = l; int b = r;
	while(a<b) {
		if(s[a]==s[b]&&s[a]!=' ') {
			cnt++;
			a++; b--;
		}else {
			break;
		}
	}
	if(cnt<4) return 0;
	int y = 0; int m = 0; int d = 0;
	for(int i = l; i <= r; i++) {
		if(i-l<4) {
			y = y*10+s[i]-'0';
		}else if(i-l<6) {
			m = m*10+s[i]-'0';
		}else {
			d = d*10+s[i]-'0';
		}
	}
	if(y%400==0||(y%4==0&&y%100!=0)) {
		day[2] = 29;
	}else{
		day[2] = 28;
	}
	if(m>0&&m<13&&d>0&&d<=day[m]) {
		return 1;
	}else {
		return 0;
	}
}

int main()
{
	while(cin.getline(s,100010)) {
		if(s[0]=='#') break;
		int l = strlen(s);
		int ans = 0;
		for(int i = 0; i < l-7; i++) {
			if(jud(i,i+7)) ans++;
		}
		printf("%d\n", ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值