acwing61场周赛补题

T1:分糖果

给定三个正整数 a,b,c。

请计算 ⌊a+b+c2⌋,即 a,b,c 相加的和除以 2 再下取整的结果。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含三个正整数 a,b,c。

输出格式
每组数据输出一行结果,表示答案。

数据范围
前三个测试点满足 1≤T≤10。
所有测试点满足 1≤T≤1000,1≤a,b,c≤1016。

输入样例:
4
1 3 4
1 10 100
10000000000000000 10000000000000000 10000000000000000
23 34 45
输出样例:
4
55
15000000000000000
51

思路简单明了。注意数据量较大,用 long long 型。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

long long a , b , c;
int  t;
long long res = 0;

int main(){
    cin >> t ;
    while(t--){
        
    cin >> a >> b >> c ;
    res = (a + b + c) /2;
    cout << res << endl;
    }
}

T2:指针

给定一个全圆量角器。

初始时,量角器上的指针指向刻度 0。

现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针)由你自由决定。

请你判断,能否通过合理选择每次拨动的方向,使得指针最终仍然指向刻度 0。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含一个整数 ai,表示一次操作的拨动角度。

输出格式
如果可以做到指针最终仍然指向刻度 0,则输出 YES,否则输出 NO。

数据范围
前 4 个测试点满足 1≤n≤3。
所有测试点满足 1≤n≤15,1≤ai≤180。

输入样例1:
3
10
20
30
输出样例1:
YES
输入样例2:
3
10
10
10
输出样例2:
NO
输入样例3:
3
120
120
120
输出样例3:
YES

先看看我比赛的时候写的错误代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>


using namespace std;

int n;
int a[20];
int main(){
    cin >> n;
    int sum = 0 ;
    int sum1 = 0;
    vector<int> presum;
    for(int i = 0 ; i < n ;i++){
         cin >> a[i] ;
         sum += a[i];
         sum1 += a[i];
        presum.push_back(sum1);
    } 
    if(sum % 360 == 0){
        cout << "YES" << endl ;
        return 0;
    }
    for(int i = 0; i < n ; i++){
        if( presum[i] == sum / 2) {
            cout << "YES" << endl ;
            return 0 ;
        }
        if(i == n - 1) cout << "NO" << endl;
    }
    
    cout << "NO" << endl;
    return 0;
}

我的思路就是先算出所有步骤的度数之和,然后计算度数前缀和。如果前缀和中有等于总数的一半的,就说明可以达到目的。然后特判一种情况就是度数之和是360的倍数。
但是这个思路没有考虑在每一步都有向左向右的自由,所以我的这个思路情况考虑的不全面。

然后比赛结束后我看到了一个位运算的解题思路。
其实就是一个枚举的思想

i & (1<<j)则表示 i 和 1<<j(即2^j) 按位与后得到的数。1<<j的二进制表示只有第j个位置(从右往左数,从0开始)上的数是1,其余位置上的数是0,i和1<<j 进行按位与操作时,i的第j个位置是1就返回1<<j(判断语句中即为true),i的第j个位置是0就返回0(判断语句中即为false)。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>


using namespace std;

int n;
int a[20];
int sum ;
int main(){
    cin >> n;
    for(int i = 0; i < n ; i++) cin >> a[i];
    for(int i = 0;i < 1<<n;i++){
        sum = 0;
        for(int j = 0 ; j< n ; j++){
            if((1 << j) & i)
                sum += a[j];
            else
                sum -= a[j];
        }
        if(sum % 360 == 0 ){
            cout << "YES" << endl;
            return 0;
        }
    }
    cout << "NO" << endl;
    return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值