E-托米的饮料

题目链接
可爱的小托米得到了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;
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/80544063
今日推荐