开始自学c++了,所以这里面的题基本都是c++的风格
*A - 或减与
输入a和b。
输出 a位或b 和 a位与b 的差。
Input
一行两个整数a, b(0 <= a, b <= 1000000000)
Output
输出 a位或b 和 a位与b 的差。
Sample Input
3 5
Sample Output
6
思路:这道题我第一次做的时候,就是最正常的思维,就是先把这两个数全部先化成二进制,然后在进行位运算,然后在化成十进制,比较繁琐。第二次直接就用了位运算。
# include <iostream>
using namespace std;
int main (void)
{
int a,b;
cin>>a>>b;
printf("%d",(a|b)-(a&b));//直接位运算就可以了。
}
B - 收金币
地上有n个金币,编号1到n,按照编号从小到大顺时摆成一个圈。每一个金币有一价值pi(1<=i<=n)。现在大Noder和小Noder开始收金币,他们每个人都要收集编号连续的金币。大Noder从1号开始顺时针收集,小Noder从n号开始逆时针收集。直到把所有的金币收集完。但是他们想要得到相同多的金币,请问他们能实现吗?
Input
单组测试数据。 第一行给出一个整数n(1<=n<=30)。 第二行有n个整数p1,p2,p3,…,pn(1<=pi<=9)。
Output
如果有解,输出Yes,否则输出No。
Sample Input
样例输入1
5
9 4 2 8 3
样例输入2
5
3 9 4 2 8
Sample Output
样例输出1
Yes
样例输出2
No
思路:这道题比较水,直接遍历就好了
#include <iostream>
using namespace std;
int main() {
int n,a[100000],i,j;
int sum1=0,sum2=0;
cin>>n;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
sum1+=a[i];//循环开始,顺时针只捡一个金币,逆时针全检,然后依次遍历
sum2=0;
for(j=i+1;j<n;j++)
{
sum2+=a[j];
}
if(sum1==sum2)
{
printf("YES");
break;
}
}
if