题目链接
可爱的小托米得到了n瓶饮料.
但他不小心把开盖的工具弄丢了,所以他只能利用饮料瓶来开盖.
已知第i个瓶子的品牌为ai,且其能打开bi品牌的瓶子.
问有几瓶饮料托米无法喝到.
被用于打开饮料瓶的瓶子不一定需要被打开.
一个瓶子不能打开其本身.
输入描述:
第一行一个整数n,表示饮料的瓶数.
接下来n行,每行两个整数ai,bi.
输出描述:
输出一行一个整数,表示小托米无法喝到的饮料瓶数.
示例1
输入
4
1 1
2 2
3 3
4 4
输出
4
示例2
输入
4
1 2
2 3
3 4
4 1
输出
0
备注:
1≤n≤100
1≤ ai,bi≤ 1000
思路
瓶子不能打开自己,就两个for循环遍历不同瓶子,看能否喝掉。
写的时候一直WA,我是先把不同的瓶子统计一下个数,然后一个for遍历1 - n如果这瓶饮料存在,而且可以消除,就记录一下。看了别人ac代码都是用for循环一个一个判断。又读了一遍题,我把重点放在了牌子饮料打开对应的牌子饮料,但是题目的意思是瓶子不能打开自己。这就产生了分歧。
对于这个样例:
4
1 1
1 1
1 1
1 1
我的结果是4,ac代码是0。
总结
刚结束的省赛,会做的题都是暴力加暴力,但是今天写题上来就没考虑暴力,以后一定要记得先考虑暴力
AC
#include<iostream>
#define N 100005
using namespace std;
int a[N], b[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 枚举不同的瓶子
if (i == j) continue;
// 只要可以喝掉就记录,然后枚举下一个。
if (a[i] == b[j]) {
ans++;
break;
}
}
}
cout << n - ans << endl;
return 0;
}
Error_code
#include<bits/stdc++.h>
#define N 10005
using namespace std;
int a[N], b[N];
int main () {
// freopen("in.txt", "r", stdin);
int n;
while (cin >> n) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for (int i = 1; i <= n; i++) {
int l, r;
cin >> l >> r;
a[l]++;
if (l != r) b[r] = 1;
}
int ans = 0;
for (int i = 1; i < N; i++)
if (b[i] && a[i]) ans += a[i];
cout << n - ans << endl;
}
return 0;
}