天勤论坛1000——1011解题笔记

来源:互联网 发布:淘宝手机详情超链接 编辑:程序博客网 时间:2024/04/30 05:05

哎,一事无成的感觉,决定天勤论坛的题从头刷起,然后再去看其他OJ上的一些题,出来混迟早要还的,既然以前没学,那自己就慢慢还吧。

一.首先前八题一律是输入输出的题,那么就来好好说说输入输出的问题。

初次接触这个东西时,有时算法搞出来了,但是输入输出总不对,一开始就没有一个好的人知道我,以至于在这里打了退堂鼓,也是当时自己不够坚定,及时找个人问问多好。


简而言之,熟练掌握所有输入输出技巧,就是掌握所有ACM问题的框架,因为一般来说掌握了输入输出问题的格式,是一个ACM问题最外层的框架。

(1)如果是单纯的输入两组数据输出结果

样例输入

1 5
10 20

样例输出

6
30

那么可以

while(cin>>a>>b){}
这样的框架用于没组样例中数据个数相同,但是不知道多少组数据,输进去就要处理的问题


(2)如果已经指明要输入多少组数据例如:

样例输入

2
1 5
10 20

样例输出

6
30

那么可以
int n;while(n--){cin>>a>>b}
//注意 此处是n--虽然本人大部分习惯喜欢--n的形式,而且在效果一样的情况下,--n的效率更高。
而且事实告诉我,大部分情况下,while循环比for循环要更招人待见。


(3)如果是以0,0这样的数据作为结束的,那么同样是在while循环里控制逻辑更便宜。

while(cin>>a>>b && (a||b)){}
由此推之,所有逻辑在while循环里体现即可
其余的一直到1007问题都是用while循环体现出来的复合问题,因此不再赘余。

1008题没什么好说,1009题主要要学会利用set()来处理格式

#include <iostream>#include <iomanip>#define MONTH 12using namespace std;int main(){    int i;    float a,sum=0;   for(i=1;i<=MONTH;++i)   {       cin>>a;       sum+=a;   }   cout<<"¥"<<setiosflags(ios::fixed)<<setprecision(2)<<sum/12<<endl; //  cout<<"¥"<<fixed<<setprecision(2)<<sum/12<<endl;   return 0;}


1010题是一种新的输入输出类型,主要要回使用gets函数来处理控制这一类数据。代码值得学习

#include <iostream>#include <iomanip>#include <cstring>#include <cstdio>using namespace std;int main(){    char s[1000004];    while(gets(s))    {        int l=strlen(s);        int flag=0;        for(int i=0; i<l; ++i)        {            if(s[i]!='A' && s[i]!='B' && s[i]!='C' && s[i]!='D' && s[i]!='F' &&s[i]!=' ')            {                flag=1;                cout<<"Unknown"<<endl;                break;            }        }        int sum=0;        int length=0;        if(flag==0)        {        for(int j=0; j<l; ++j)        {            if(s[j]=='A')            {                sum+=4;                length++;            }            if(s[j]=='B')            {                sum+=3;                length++;            }            if(s[j]=='C')            {                sum+=2;                length++;            }            if(s[j]=='D')            {                sum+=1;                length++;            }            if(s[j]=='F')            {                sum+=0;                length++;            }        }        double average=sum*1.0 / (length *1.0);        printf("%.2f\n",average);        }    }    return 0;}


或者输入改为

        double average=sum*1.0 / (length *1.0);
        cout<<fixed<<setprecision(2)<<average<<endl;

最后一题1011,这一题中本身没什么说的,但是我有一个漏洞的解法,sample可以过,但是test不过,请问为什么?

#include <iostream>using namespace std;int main(){    int n;    cin>>n;    while(n--)    {        int a[6];        for(int i=0;i<6;++i)        {            cin>>a[i];        }        if((100*a[0]+10*a[1]+a[2])<(100*a[3]+10*a[4]+a[5]))            cout<<"Second"<<endl;        else if((100*a[0]+10*a[1]+a[2])>(100*a[3]+10*a[4]+a[5]))            cout<<"First"<<endl;        else            cout<<"Same"<<endl;    }    return 0;}

原因是,你的每一个版本号,未必是个位数。因此不能用10进制加权来判断。

over。明天再刷几道入门水题。

0 0
原创粉丝点击