【重点】201601 小王围着操场跑圈,每次跑三圈,请输入行数,每行输入9个正整数,分别表示每次每一圈的分,秒,毫秒,
输出每次跑步所用的平均时间
分析:为了计算平均时间,需要求出跑三圈所用的总秒数,求出三次跑圈的总秒数后,再求出单次跑圈的平均秒数,利用单次跑圈的平均秒数求商,求余,得到单次跑圈的分,秒,毫秒
#include <iostream>
using namespace std;
struct Time
{
int m,s,ms;
int total;
};
int main()
{
Time t[3];
for(int i=0;i<3;i++)
{
cin>>t[i].m>>t[i].s>>t[i].ms;
t[i].total = t[i].m * 60000 + t[i].s *1000 + t[i].ms;
}
int total = 0;
for(int i=0;i<3;i++)
{
total += t[i].total;
}
total = total / 3;
Time temp;
temp.m = total /60000;
temp.s = total %60000 /1000;
temp.ms = total %1000;
cout<<temp.m<<" "<<temp.s<<" "<<temp.ms;
return 0;
}
201602 排序,输入n,有n组测试数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> a[n];
int m;
for(int i=0;i<n;i++)
{
while(1)
{
cin>>m;
a[i].push_back(m);
if(cin.get() == '\n') break;
}
sort(a[i].begin(),a[i].end());
}
for(int i=0;i<n;i++)
{
for(vector<int>::iterator it =a[i].begin();it != a[i].end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
return 0;
}
201603 算术表达式
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin>>n;
double a[n];
double b[n] = {0};
for(int i=0;i<n;i++)
{
char c;
cin>>a[0];
c = getchar();
int k =0 ;
double ch;
while(c != '\n')
{
cin>>ch;
switch(c)
{
case '+': a[++k] =ch;break;
case '-': a[++k] =-ch;break;
case '*': a[k] *=ch;break;
case '/': a[k] /=ch;break;
}
c = getchar();
}
for(int j=0;j<=k;j++)
{
b[i] += a[j];
}
}
for(int i=0;i<n;i++)
{
if(abs(b[i] - int(b[i])<0.000001))
{
printf("%.0f\n",b[i]);
}
else
{
printf("%.1f\n",b[i]);
}
}
return 0;
}
201604用海伦公式计算三角形面积
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int main()
{
double a,b,c,p;
cin>>a>>b>>c;
p = (a+b+c)/2;
if((a+b)>c&&(a-b)<c && (a+c)>b&&(a-c)<b && (b+c)>a&&(b-c)<a)
{
printf("%.2f",sqrt(p*(p-a)*(p-b)*(p-c)));
}
else
{
cout<<"0.00";
}
return 0;
}
201701 输入两组时间,计算平均时间
#include <iostream>
using namespace std;
int main()
{
int a,b,c,a1,b1,c1;
cin>>a>>b>>c>>a1>>b1>>c1;
if(!(a+1==a1 || a == a1+1))
{
if(a == 0)
{
a = 12;
}
else if(a1 == 0)
{
a1 = 12;
}
}
int t1,t2;
t1 = a *3600 + b*60 +c;
t2 = a1 *3600 + b1*60 +c1;
t1 = (t1 + t2)/2;
a = t1 / 3600;
b = t1 %3600/60;
c = t1 %60;
cout<<a<<" "<<b<<" "<<c;
return 0;
}
201702 排序,输入n,有n组测试数
总结:本题是对n组测试数,而不是一组,一定要看清题目
知识点1:
如何输入n组测试数为难点
for()
{
while(1)
{
cin>>m;
把m放入vector中
cin.get() == '\n’时,跳出循环
}
}
知识点2:
vector v;
定义的v变量的v.end()是指向最后一个数的后面
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> a[n];
int m;
for(int i=0;i<n;i++)
{
while(1)
{
cin>>m;
a[i].push_back(m);
if(cin.get() == '\n') break;
}
sort(a[i].begin(),a[i].end());
}
for(int i=0;i<n;i++)
{
for(vector<int>::iterator it =a[i].begin();it != a[i].end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
return 0;
}
201703 输入行数n,再在每一行输出表达式,计算结果(重复)
201704.括号匹配,输入测试组n,接着n行实现n组测试
#include <iostream>
#include <stack>
using namespace std;
int main()
{
char c;
string s;
stack<int> vs;
int flag =1 ;
cin>>s;
char x;
for(int i=0;i<s.length();i++)
{
switch(s[i])
{
case '(': vs.push(s[i]);break;
case '{': vs.push(s[i]);break;
case '[': vs.push(s[i]);break;
case ')':
x = vs.top();
vs.pop();
if(x != '(') flag = 0;
break;
case ']':
x = vs.top();
vs.pop();
if(x != '[') flag = 0;
break;
case '}':
x = vs.top();
vs.pop();
if(x != '{') flag = 0;
break;
}
}
if(!vs.empty()) flag = 0;
if(flag == 1 ) cout<<"yes";
else cout<<"no";
}
201801夏令营:输入三角形的三条边,判断它们能否构成三角形
提示:任意两边之和大于第三边,任意两边之差小于第三边(简单)
#include <iostream>
using namespace std;
int main()
{
double a,b,c;
cin>>a>>b>>c;
if((a+b)>c&&(a-b)<c && (a+c)>b&&(a-c)<b && (b+c)>a&&(b-c)<a)
{
cout<<"yes";
}
else
cout<<"no";
return 0;
}
201802夏:2.输入 n 组数据,其中每组数据长度为 m,进行升序排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int > v[2];
int n;
cin>>n;
int t;
for(int i=0;i<n;i++)
{
while(1)
{
cin>>t;
v[i].push_back(t);
if(cin.get() == '\n') break;
}
sort(v[i].begin(),v[i].end());
}
for(int i=0;i<n;i++)
{
for(vector<int>::iterator it = v[i].begin();it != v[i].end();it++)
cout<< *it<< " ";
cout<<endl;
}
return 0;
}
【重点】201803夏令营:
北京时间和美国时间相差 16 小时,即美国时间比北京时间慢 16 小时,输入 n
组北京时间,每组有 5 个整型数据,分别表示年、月、日、小时、分钟,输出美
国时间,同时考虑闰年、前一月份等问题。
解题思路:
找特殊时刻:
小时:>15&&<24
日:1号
在1号的情况下,可以根据月求出前面的月份的天数
在1月的情况下:
年,月
不在一月的情况下
不在一号的情况下
日减1
版本2:
```cpp
#include <iostream>
#include <vector>
using namespace std;
struct Time
{
int ye,mo,da,ho,mi;
};
int main()
{
Time t;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
cin>>t.ye>>t.mo>>t.da>>t.ho>>t.mi;
if(t.ye%400==0 || (t.ye/100!=0&&t.ye%4==0))
{
days[2] +=1;
}
if(t.da==1)
if(t.mo == 1)
{
if(t.ho<16)
{
t.ye -=1;
t.mo = 12;
t.da = 31;
t.ho = 24+t.ho-16;
}
else
t.ho -=16;
}
else
{
if(t.ho<16)
{
t.mo -= 1;
t.da = days[t.mo];
t.ho = 24+t.ho-16;
}
else
t.ho -=16;
}
else
{
if(t.ho<16)
{
t.da -= 1;
t.ho = 24+t.ho-16;
}
else
t.ho -=16;
}
printf("%d %05d %05d %02d %02d",t.ye,t.mo,t.da,t.ho,t.mi);
return 0;
}
201804夏:4.运用求根公式求一元二次方程的解, 若无解,输出“NaN”,有解则输出结果,
保留两位小数,四舍五入。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double a,b,c;
cin>>a>>b>>c;
if((b*b - 4*a*c)>0)
{
printf("%.2f %.2f",(-b+sqrt(b*b-4*a*c))/(2*a),(-b-sqrt(b*b-4*a*c))/(2*a));
}
else if(!(b*b - 4*a*c))
{
printf("%.2f %.2f",(-b)/(2*a),(-b)/(2*a));
}
else
cout<<"NaN";
return 0;
}
201801
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a,b;
int num[n];
for(int i=0;i<n;i++)
{
cin>>a>>b;
num[i] = a*b;
}
for(int i=0;i<n;i++)
{
cout<<num[i]<<endl;
}
}
201802
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int b[n];
int data;
for(int i =0;i<n;i++)
{
cin>>data;
b[i]=1;
for(int j=data;data>0;data--)
{
b[i] *=data ;
}
}
for(int i=0;i<n;i++)
{
cout<<b[i]<<endl;
}
return 0;
}
201803
#include <iostream>
using namespace std;
int jcheng(int n);
int main()
{
int n,m;
cin>>n>>m;
cout<< (jcheng(n)/(jcheng(m)*jcheng(n-m)));
return 0;
}
int jcheng(int n)
{
int sum=1;
for(int i=n;i>0;i--)
{
sum *=i;
}
return sum;
}
201804
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
vector<int> v[n];
int t;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>t;
v[i].push_back(t);
}
sort(v[i].begin(),v[i].end());
}
for(int i=0;i<n;i++)
{
for(vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
cout << *it<<" " ;
cout<<endl;
}
return 0;
}
【重点】201805字符串反转:指定n组字符穿,每组字符串个数不超过20,输出每组字符串的反串
重点在于xi an如何接收
#include <iostream>
#include <string>
using namespace std;
string myreverse(string s);
int main()
{
int n;
cin>>n;
string str[n];
getchar();
for( int i=0;i<n;i++)
{
getline(cin,str[i]);
str[i] = myreverse(str[i]);
}
for(int i=0;i<n;i++)
{
cout<<str[i]<<endl;
}
return 0;
}
string myreverse(string s)
{
char temp;
for(unsigned int i=0;i<s.length()/2;i++)
{
temp = s[i];
s[i] = s[s.length()-1-i];
s[s.length()-1-i] = temp;
}
return s;
}
【重点】201806判断回文
#include <iostream>
using namespace std;
bool judge(string s);
int main()
{
int n;
cin>>n;
string str[n];
getchar();
for(int i=0;i<n;i++)
{
getline(cin,str[i]);
}
for(int i=0;i<n;i++)
{
if(judge(str[i]))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
bool judge(string s)
{
unsigned int i=0;
for(i=0;i<s.length()/2;i++)
{
if(s[i] != s[s.length()-1-i])
{
return false;
}
}
return true;
}
结果:
【重点】201807 判断括号是否匹配:给定n组数,每组为一个字符串,测试三种括号:
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
bool judge(string str);
int main()
{
int n;
cin>>n;
string str[n];
for(int i=0;i<n;i++)
{
cin>>str[i];
}
for(int i=0;i<n;i++)
{
if(judge(str[i]))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
bool judge(string str)
{
stack<char> s;
for(unsigned int i=0;i<str.length();i++)
{
switch(str[i])
{
case '{':
s.push(str[i]);break;
case '(':
s.push(str[i]);break;
case '[':
s.push(str[i]);break;
case '}':
if('{' != s.top())
return false;
s.pop();
break;
case ')':
if('(' != s.top())
return false;
s.pop();
break;
case ']':
if('[' != s.top())
return false;
s.pop();
break;
}
}
if(!s.empty())
return false;
else
return true;
}
结果:
【重点】201903 判断IP地址是否合法,N行,以字符串形式输入,格式为a.b.c.d,每个均为整数,输出判断是否为ip,每个数均在【0,255】之间,是输出yes,否no
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
vector<int> split(string str, string pattern);
bool Judge(vector<int> v);
int main()
{
int n;
cin>>n;
string s[n];
for(int j=0;j<n;j++)
{
cin>>s[j];
}
for(int j=0;j<n;j++)
{
vector<int> v = split(s[j],".");
if(Judge(v))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
/*
****vector<int> split(string str,string pattern)****
由于char *strtok(char *str,char *delim);
所以split主要做两件事:
1.将string类型的str转化为char *
2.通过strtok(char *str,char *delim),通过第二个参数,将str裂解为四个int类型的数值,放到vector数组中
*/
vector<int> split(string str,string pattern)
{
char * strc = new char[strlen(str.c_str())+1];
strcpy(strc, str.c_str());
vector<int> resultVec;
char* tmpStr = strtok(strc, pattern.c_str());
while (tmpStr != NULL)
{
resultVec.push_back(atoi(string(tmpStr).c_str()));
tmpStr = strtok(NULL, pattern.c_str());
}
delete[] strc;
return resultVec;
}
bool Judge(vector<int> v)//判断v存放的四个int类型的变量是否都在【0,255】
{
for(unsigned int j=0;j<v.size();j++)
{
if(!(0<=v[j]&&v[j]<=255))
{
return false;
}
}
return true;
}
结果:
【重点】:201905一年中任意两天差值。输入N组数测试。(保证后一天日期晚于前一天)输出期间天数。
解题思路:
先判断是否为闰年,闰年二月为29天。
本题要求两组数值在一年内,所以输入的两组数,
若月份相同,天数直接求,
若月份不同,写一个循环,计算从从前面的月份,到后面月份所有的天数加起来即可。
#include <iostream>
using namespace std;
struct time
{
int y,m,d;
};
int main()
{
int N;
cin>>N;
struct time t[N][2];
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int result[N]={0};
for(int i=0;i<N;i++)
{
cin>>t[i][0].y>>t[i][0].m>>t[i][0].d>>t[i][1].y>>t[i][1].m>>t[i][1].d;
}
for(int i=0;i<N;i++)
{
if(t[i][0].y % 400 == 0 ||(t[i][0].y % 4==0 && t[i][0].y % 100!=0))
days[1] =29;
else
days[1] = 28;
if(t[i][0].m == t[i][1].m)
{
result[i] = t[i][1].d - t[i][0].d+1;
}
else
{
for(int k=t[i][0].m-1;k<t[i][1].m-1;k++)//1——12月在数组中表示为0~11
{
result[i] +=days[k];
}
result[i]= result[i] - t[i][0].d+1+t[i][1].d;
}
}
for(int i=0;i<N;i++)
{
cout<<result[i]<<endl;
}
return 0;
}
2010Catalan数
算法思想:根据表达式写递归,再进行调用即可
f = 0,1
f(n) = f(0)f(n-1) + …+ f(n-1)f(0);
#include <iostream>
using namespace std;
int Catalan(int c)
{
if(c == 0)
{
return 1;
}
else if( c == 1 )
{
return 1;
}
else
{
int sum =0 ;
for(int i=0;i<c;i++)
{
sum = sum + Catalan(i)*Catalan(c-i-1);
}
return sum;
}
}
int main()
{
int n;
cin>>n;
cout<<Catalan(n);
return 0;
}
2009 正方形
解题思路:
输入四个点后,需要计算四个点的距离,由于四个不一定是按顺序输入,所以需要对这四个点进行排序,让横坐标递增,纵坐标递减
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct point
{
double x;
double y;
};
bool cmp(point a,point b)
{
if(a.x!=b.x)
return a.x<b.x;//X升序
else
return a.y>b.x;//Y逆序
}
double d(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool Isrec(point a,point o,point b)
{
double temp = (a.x-o.x)*(b.x-o.x) + (a.y-o.y)*(b.y-o.y);
if(temp == 0)
return true;
return false;
}
int main()
{
point p[4];
for(int i=0;i<4;i++)
cin>>p[i].x>>p[i].y;
sort(p,p+4,cmp);
double dd[4];
dd[0] = d(p[0],p[2]);
dd[1] = d(p[2],p[3]);
dd[2] = d(p[3],p[1]);
dd[3] = d(p[1],p[0]);
if(dd[0]==dd[1]&&dd[1]==dd[2]&&dd[2]==dd[3]&&Isrec(p[0],p[2],p[3]))
{
cout<<"YES";
}
else
cout<<"No";
return 0;
}