『Luogu OJ』『C++』Level 1-3 循环!循环!循环!

关卡1-3,6道题  循环!循环!循环!

任务说明:计算机最不怕的就是重复。你让它做10000次同样的事它也不怕啦,但是让他做1亿亿次的话……

要完成这个任务,请将以下的题目都AC掉(即通过这道题目):

1. 三连击 P1008

2.级数求和 P1035

3.数字反转 P1307

4.小玉在游泳 P1423

5.小鱼的航程(改进版) P1424 

6.计数问题 P1980

 成就达成时间:2015-07-15 21:54

 

什么?你问我这么水的题怎么拖了这么久?

首先今天课比较多……

其次被string坑死了

真是Qiku了、、、

我大Pascal多么自然地str(i,s)什么的,跑这来没玩死我。

 

1. 三连击 P1008

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。

hhhhh。NOIp史上最伟大的题。

他训练了非常伟大的一种方法---打表法。

 1 #include<iostream> 
 2 using namespace std;
 3 int main()
 4 {
 5     cout<<192<<" "<<384<<" "<<576<<endl;
 6      cout<<219<<" "<<438<<" "<<657<<endl;
 7      cout<<273<<" "<<546<<" "<<819<<endl;
 8      cout<<327<<" "<<654<<" "<<981<<endl;
 9   return 0;
10 } 
11  

 

2.级数求和 P1035

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。
  现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

我如今才意识到居然那么久之前就玩过级数

当初怎么想的?台阶级数?hhhh

这题也是水题

但是专坑Pascal-->c系列选手

 1 #include<iostream> 
 2 using namespace std;
 3 int main()
 4 {
 5     int k;
 6     cin>>k;
 7     double s=0;
 8     for (int i=1;i<=21400000;++i) //我就是属于那种能不写while就不写的人,肉麻吧
 9       {
10           s=s+1.0/i;                           //传统原生c系选手一定很清楚
11           if (s>k)                                //  除号前后是整数为整除,所以一定写0.1    
12           {
13               cout<<i<<endl;
14               return 0;
15               exit;
16           }
17       }
18   return 0;
19 } 
20  

 

3.数字反转 P1307

  给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

输入格式:

  输入文件名为reverse.in 。 
  输入共1 行,一个整数 N。

输出格式:

  输出文件名为reverse.out 。 
  输出共1行,一个整数,表示反转后的新数。

【样例输入1】
123
【样例输入2】
-380
【样例输出1】
321
【样例输出2】
-83

没有难度,我说对pascal,然而如果你不熟悉String in Cpp(像我一样、那就呵呵呵吧)
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int main()
 5 {
 6     string st;
 7     char s;
 8     cin>>st;
 9     int n=st.size();  //n:=length(st);
10     n--;                  //下标为0~n-1
11     s=st[n];
12     while (s=='0')  //注意等于是双等号这个专为Pascal设计的坑。
13     {0
14              --n;
15             s=st[n];
16     } 
17     if (st[0]=='-')    //Cpp中都是0开头,st[0]存第一个字符而不是字符长度
18     {  cout<<'-';
19        for (int i=n;i>=1;--i)
20          cout<<st[i];
21     }
22     else 
23     for (int i=n;i>=0;--i)
24         cout<<st[i];
25   return 0;            
26 }

 

4.小玉在游泳 P1423

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%。现在小玉想知4道,如果要游到距离x米的地方,她需要游多少步呢。请你编程解决这个问题。

这个丝毫没有坑,一分钟搞定。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     double meters=0;
 6     double s=0;
 7     double power=2.0;
 8     cin>>meters;
 9     for (int i=1;i<=21000000;++i)  //依旧强行用for
10       {
11           s=s+power;
12           power=power*0.98;          
13           if (s>=meters)
14           {
15               cout<<i<<endl;
16               return 0;
17               exit;
18           }
19       }
20   return 0;
21 }
22

 

5.小鱼的航程(改进版) P1424 

有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x<=7)开始算起,请问这样过了n天以后,小鱼一共累计游泳了多少公里呢?

这个我被坑了很久。最后换了下算法……晕晕乎乎的丝毫想不出之前哪里错了(WA 1个点)

 1 /*错误代码,90分*/
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int x,n;
 7     cin>>x>>n;
 8     int length=0;
 9     while (n>0)
10         {
11            for (int i=x;i<=5;++i,--n)
12              {
13                  if (n<=0) break; 
14                 length+=250;                 
15              }
16            x=1;    
17            n=n-2;
18            if (n<=0) break;                  
19         }
20     cout<<length<<endl;
21 return 0; 
22 }
 1 /* AC */
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int x,n;
 7     cin>>x>>n;
 8     int length=0;
 9     for (int i=1;i<=n;++i)
10        {
11           if (x<=5) length+=250;                 
12           ++x;    
13           if (x==8) x=1;                  
14         }
15     cout<<length<<endl;
16     return 0;
17 }


这个 思路上没什么问题。但PJ第一道这种水平还老挂掉真是太丢人了!!!!!!!!!没脸见人了。

Qiku……

然而,这远远不是终点

6.计数问题 P1980

 试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1
到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。

这又是PJ第一道水题。

PASCAL算法十分简单啊

str(i,s)爆搜s中的每个字符,完了

数据范围是<1000000 怎么看都不会超时。

然而

首先我翻了半天都不知道怎么Cpp转字符串

于是我可耻地抄了一个函数

1 #include<string>
2 #include<sstream>
3 
4 string getstring (const int n)
5 {
6     stringstream newstr;
7     newstr<<n;
8     return newstr.str()
9 }

然而……这个函数效率似乎很低下

 1 #include<iostream>
 2 #include <string>
 3 #include <sstream>
 4 #include <stdlib.h>
 5 using namespace std;
 6 string getstring (const int n)
 7 {
 8 
 9     stringstream newstr;
10     newstr<<n;
11     return newstr.str();
12 
13 }
14 int main()
15 {
16   long long num=0;
17   int n,x;
18   string st;
19   string xx;
20   cin>>n>>x;
21   xx=getstring(x); 
22   for (int i=1;i<=n;++i)
23     {
24         st=getstring(i);
25         int m=st.size();
26         for (int j=0;j<=m-1;++j)
27           {
28              if (st[j]==xx[0]) ++num;    
29           }          
30     }    cout<<num<<endl;    
31   return 0;    
32 }

这么简洁的式字在Luogu 上居然TLE4个点、、我本上跑1000000 4之类的点正好秒出,忘记NOIp官方平台什么鬼了。
测试点 #1通过该测试点。 得分10,耗时0ms,内存2134kB。
测试点 #2通过该测试点。 得分10,耗时0ms,内存2138kB。
测试点 #3超过时间限制。 得分0,内存2109kB。
测试点 #4通过该测试点。 得分10,耗时15ms,内存2138kB。
测试点 #5超过时间限制。 得分0,内存2109kB。
测试点 #6通过该测试点。 得分10,耗时811ms,内存2142kB。
测试点 #7通过该测试点。 得分10,耗时0ms,内存2129kB。
测试点 #8通过该测试点。 得分10,耗时748ms,内存2138kB。
测试点 #9超过时间限制。 得分0,内存2105kB。
测试点 #10超过时间限制。 得分0,内存2113kB。

只好写了个数学算法的、、依旧肉麻哦,值得期待。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5   int num=0;
 6   int n,x;
 7   cin>>n>>x;
 8   for (int i=1;i<=n;++i)
 9     {
10         if(i%10==x)num++;
11         if(i/10%10==x&&i>9) num++;
12         if(i/100%10==x&&i>99) num++;
13         if(i/1000%10==x&&i>999) num++;
14         if(i/10000%10==x&&i>9999) num++;
15         if(i/100000%10==x&&i>99999) num++;
16     }
17   cout<<num<<endl;    
18   return 0;    
19 }

麻不麻

嗯、还好吧

 

晚安呐、

 

posted @ 2015-07-15 22:20  Iris.Catch-22.S、`  阅读(518)  评论(0编辑  收藏  举报