A.Rudolf and the Ticket
#include<iostream>
usiong namespace std;
int main()
{
int xun; //定义总共的测试次数
cin >> xun;
for (int i = 0; i < xun; i++)
{
int n, m, k; //定义两个数组的大小以及相加的界限
cin >> n >> m >> k;
int* zuo;
zuo = new int[n]; //利用new进行动态内存分配,使得代码更加的灵活多用,减少了时
//间的消耗
for (int j = 0; j < n; j++)//输入第一个组的数有哪些
{
cin >> zuo[j];
}
int* you; //同上
you = new int[m];
for (int h = 0; h < m;h++)//输入第二个组的数
{
cin >> you[h];
}
int count = 0; //统计有多少种情况
for (int j = 0; j < n; j++)//双重循环将第一组的每一个数都与第二组的每一个数相加一次
{
int sum = 0; //一定放在里头(可以在外面定义,但一定在函数里面赋0值),及
//时将相加的值归零
for (int h= 0; h< m;h++)
{
sum = zuo[j] + you[h];
if (sum <= k) //满足情况加一
count++;
}
}
cout<<""<< count << endl;
delete[]zuo;//*****一定要记得delete自己分配的空间,不然随着运行系统就会崩溃*****\\
delete[]you;//最好就在new完之后马上将delete打出,以防止忘记
//(delete一定要在不再需要我们new出来的变量或者数组后)
}
return 0;
}
B. Rudolf and 121
#include<iostream>
using namespace std;
int main()
{
int xun; //测试用例数
cin >> xun;
for (int i = 0; i < xun; i++)
{
int n; //输入数组大小
cin >> n;
int* p;
p = new int[n];
int ji = 0;
for (int j = 0; j < n; j++)//输入数组数据
{
cin >> p[j];
}
//这个算法就是从第一个开始每次计算三个,根据题意就是要每一个都减到零吗,那就把我们每次的第一个减到零,那由题可知第二个就要减两倍第一个,第三个减去一倍第一个
//举例现在它输入5个数按顺序是1 3 5 5 2分别是a1,a2,a3,a4,a5
//最前面三个数是1 3 5,1减到零需要减一,3是第二个数就要减二变为1,5就要减一变为4
//现在这五个数就是0 1 4 5 2,再按上述办法下一次就是0 0 2 4 2再一次就变成0 0 0 0 0
//相当于第一个数是题目中的i-1,我们不断把i-1往后移
for (int k = 1; k < n-1; k++)//数组最后一个是n-1,最后有个k-1,所以不能取到n-1
{
p[k] -= p[k - 1]<<1;
p[k + 1] -= p[k - 1];
p[k - 1] = 0;
if (p[k] < 0) //如果出现负数那肯定不会满足情况,总不能一负数减正数能减到大于零吧
{
ji = 1;
break;
}
}
if (p[n - 1]!=0 || p[n - 2]!=0)//我们每次都只把三个的第一个减了,到剩下有最后两个,
{ //不要丢了
ji = 1;
}
if (ji)cout << "No" << endl;
else cout << "Yes" << endl;
delete[]p;
}
return 0;
}
C.Rudolf and the Ugly String
#include<iostream>
using namespace std;
//这个题目其实跟B那题思想是触类旁通的,也是每次读三个,只不过读的是字符型而且要判断两次是否等
//于‘map'或者'pie',唯一我觉得有点坑的就是像“mapie”这个是算的一个,因为相当于先检测到了map然后
//这个p就被用掉了不能再和后面的ie组合;解决也很简单就是我只要读到了“map”或者“pie”就把它变成“ ”
//(空格)我取巧只在读到map后把p变成了空格,因为在这个题目中只会出现这样的叠在一起,但建议读者
//在读到这两个字符串后把他们都空格掉,保持写代码的严谨性,可能在别的题目就不止一种叠加方式
int main()
{
int xun;
cin >> xun;
for (int i = 0; i < xun; i++)
{
int l;
cin >> l;
char* s;
s = new char[2*l];
cin >> s;
int ji = 0;
for (int j = 0; j <l-2; j++)
{
if (s[j] == 'p'&&s[j+1]=='i'&&s[j+2]=='e')
{
ji ++;
continue;
}
else if (s[j] == 'm'&&s[j+1]=='a'&&s[j+2]=='p')
{
ji++;
s[j + 2] = ' ';
//cout <<s[j]<< "," << s[j+1]<<"," << s[j + 2] << endl;
continue;
}
else
continue;
}
cout << "" << ji << endl;
delete[]s;
}
return 0;
}