Codeforces 1060A Phone Numbers

打扰了,一开始题目就读错了。

看样例的时候百思不得其解,反复看题干N多遍,都要看吐了,实在没发现自己哪里理解错了。

但是不行啊,自己理解的题意连样例也通不过!!

这可是A题啊,水题啊,5000+人通过的!

好了,上google翻译吧。

.......

Each card must be used in at most one phone number。

Google翻译:每张卡最多只能使用一个电话号码(有点生硬23333)

我的翻译:每张卡最多只能当作一个电话数字

看起来一样?我理解的是每张卡片可以出现在不同的电话号码里!

为什么我会这样理解呢?不怪我啊!这题目**后面还有神补刀!

The phone numbers do not necessarily have to be distinct.

电话号码不需要不同,也就是存在相同的电话号码。

看起来很奇怪的要求吧?为什么会这样呢?肯定是因为卡片是不同的啊!

比如说第一个样例:

INPUT

11
00000000008

OUTPUT

1

我:??????

怎么可能是1呢?8肯定被固定在首位,但是剩下的0可以随便排啊?!

在我看来,每张卡片是“不同的”,尽管它们代表的数字是相同的!

电话号码里面的数字虽然一样,但是卡片不是一样的啊!

卡片位置不同→电话号码不同,多自然的想法!

我还在想,虽然给的n的范围是从1到100,万一给100个8怎么办...

随便排啊,long long都不好使啊,这还是A题吗!

结果....

题意理解错了啊喂!

卡片不能重复使用在"不同"的电话号码里面啊!

啊啊啊啊啊啊!

事实证明,A题还是水题的!

如果你想了很长时间没有想出来,

不妨看看题意有没有读错!!!!!!!!!!!

#define  _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

int n;
char s[105];
int temp[10];

int main() {
	scanf("%d", &n);
	scanf("%s", &s);
	int ans = 0;
	for (int i = 0;i < 10;++i) {
		temp[i] = 0;
	}
	for (int i = 0;i < n;++i) {
		temp[s[i] - 48]++;
	}
	if (n <= 10 || temp[8] == 0) {
		printf("0\n");
	}
	else {
		int leftnumber = n - temp[8];
		int most = leftnumber / 10;
		if (temp[8] >= most) {
			ans += most;
			temp[8] -= most;
			leftnumber = leftnumber - 10 * most;
			if (temp[8] + leftnumber >= 11) {
				ans++;
				temp[8] = temp[8] - (11 - leftnumber);
				if (temp[8] >= 11) {
					ans += (temp[8] / 11);
				}
			}
		}
		else {
			ans = temp[8];
		}
		printf("%d\n", ans);
	}
	//system("pause");
	return 0;
}

 

你可能感兴趣的:(ACM)