用scanf而不用cin的情况

scanf是格式化输入,printf是格式化输出。
cin是输入流,cout是输出流。效率稍低,但书写简便。

效率低的原因可以自行百度。

数据量大的题目最好一开始就用scanf,printf写,不要等超时了再回来改。

举例。

从零开始的异世界生活

Time Limit: 2000 ms Memory Limit: 65536 KiB

Problem Description

486 作为有史以来最悲惨的男主,我们知道他需要经历一些无限次的死亡和轮回才能进行下一个关卡。

3915-1

现在给你 n 个连续的时间点,每个时间点 i 上都会有一个心理伤害值 hurt[i],然后告诉你 m 个死亡时间点 deth[i],以及当前死亡时间点会死亡的次数 num[i],和死亡后 486 会返回的时间点(也就是最近的存档点 return[i])。

其整个过程就是 486 从时间点 0 开始 (hurt[0] = 0),不断向下一个时间点 1, 2, 3… 前进,当遇到死亡时间点的时候,486 会死亡一次,然后返回到最近的一个存档点,然后会继续从存档点向下一个时间点前进,当又遇到死亡时间点的时候,如果死亡次数还不够需要死亡的次数,那么当前不能过关,继续回到最近的存档点。达到需要死亡的次数之后,便不需要死亡,继续向下一个时间点前进。486 在每一个时间点 i 上都会遭受心理伤害 hurt[i]。为什么 486 的心理防线不会崩溃呢,当然因为有我们的蕾姆酱了,每次受到心理伤害的时候蕾姆酱都会治愈掉。第一季的目标便是走到时间点 n,现在需要你计算一下蕾姆酱的治愈总和(也就是 486 从时间点 0 到时间点 n 所遭受的心理攻击的总和)。

那么萌萌的蕾姆酱到底治愈了多少呢她这么萌,你还不快告诉她么

Input

输入数据有多组(数据组数不超过 30),到 EOF 结束。
对于每组数据:
第一行输入两个以空格分隔的整数 n 和 m
n (1 <= n <= 100000) 表示 486 要到达的目标时间点(起始目标点 0,hurt[0] = 0,每次前进一个时间点)
接下来一行输入 n 个以空格分隔的整数,表示 hurt[i]。表示 486 在当前时间点会遭受到的伤害值
接下来输入 m (0 <= m <= n/2) 行,每行 3 个整数,分别是 deth[i],return[i] 和 num[i],表示 deth[i] 时间点需要死亡的次数以及会返回的最近的存档点
保证:0 <= hurt[i] <= 100,1 <= deth[i-1] < return[i] < deth[i] <= n, 0 <= num[i] <= 100。
当前时间点如果不需要死亡,那么486不会返回最近的存档点,会继续前进。

Output

对于每组数据,输出一个整数,表示蕾姆酱总的治愈值(486 会遭受到的总的伤害值)。

Sample Input

10 3
1 2 3 4 5 5 4 3 2 1
4 2 1
6 5 2
10 9 1

Sample Output

62

Hint

1+2+3+4 死亡 +2+3+4+5+5 死亡 +5+5 死亡 +5+5+4+3+2+1 死亡 +2+1 = 62。

Source

【“师创杯”山东理工大学第九届ACM程序设计竞赛 正式赛】UMR

用cin cout 的代码:

#include <bits/stdc++.h>

using namespace std;

typedef struct node {
    int date;
    int ret;
    int sum;
} ty;

int main()
{
    ty a[100002];
    int n,m,i,x;
    while ( cin>>n>>m ) {
        for ( i=1; i<=n; i++ ) {
            cin >> a[i].date;
            a[i].ret = i;
            a[i].sum = 0;
        }
        for ( i=1; i<=m; i++ ) {
            cin >> x;
            cin >> a[x].ret >> a[x].sum;
        }

        int i = 1;
        int ans = 0;
        while ( i!=n+1 ) {
            ans += a[i].date;
            if ( a[i].sum>0 ) {
                a[i].sum --;
                i = a[i].ret;
            }
            else {
                i ++;
            }
        }

        cout << ans << endl;


    }


    return 0;
}


/***************************************************
User name: rj180323石旭
Result: Time Limit Exceeded
Take time: 2010ms
Take Memory: 0KB
Submit time: 2019-05-19 19:26:37
****************************************************/

用scanf printf的代码

#include <bits/stdc++.h>

using namespace std;

typedef struct node {
    int date;
    int ret;
    int sum;
} ty;

int main()
{
    ty a[100002];
    int n,m,i,x;
    while ( ~scanf("%d %d",&n,&m) ) {
        for ( i=1; i<=n; i++ ) {
            scanf("%d",&a[i].date);
            a[i].ret = i;
            a[i].sum = 0;
        }
        for ( i=1; i<=m; i++ ) {
            scanf("%d",&x);
            scanf("%d %d",&a[x].ret,&a[x].sum);
        }

        int i = 1;
        int ans = 0;
        while ( i!=n+1 ) {
            ans += a[i].date;
            if ( a[i].sum>0 ) {
                a[i].sum --;
                i = a[i].ret;
            }
            else {
                i ++;
            }
        }
        printf("%d\n",ans);

    }


    return 0;
}


/***************************************************
User name: rj180323石旭
Result: Accepted
Take time: 1092ms
Take Memory: 1320KB
Submit time: 2019-05-19 19:34:02
****************************************************/

可以看出来,第一个用时2010+ms 直接超时wa了,而一模一样的代码把cin换成scanf用时直接降到了1092ms。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值