A.相反数
重点:stoi\to_string\reverse函数

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string s=to_string(n);//将n转换为字符串
    reverse(s.begin(),s.end());//字符串反转
    int k = stoi(s);//转换成数
    cout<<k+n<<endl;
    return 0;
}

B.Music Problem
重点:抽屉原理、01背包

#include<bits/stdc++.h>
using namespace std;
const int N= 1e5+10;
const int M= 3610;
const int p= 3600;
int a[N];
int dp[M],temp[M];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        memset(dp,0,sizeof dp);
        memset(temp,0,sizeof temp);//清空数组
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);//输入部分
            a[i]%=p;//倍数直接忽略
        }
        if(n>3600){//由抽屉原理可以得到如果多于3600肯定有解
            printf("YES\n");
            continue;
        }
        for(int i=1;i<=n;i++)//01背包模板,需要注意因为取模的关系,可能本身取一次,然后又取一次,用临时数组解决这一问题
        {
            for(int j=0;j<3600;j++)
                if(temp[j]||j==0) dp[(j+a[i])%p]=1;
            if(dp[0]) break;
            for(int i=0;i<3600;i++)
               temp[i]=dp[i];
        }
        puts(dp[0]?"YES":"NO");
    }
    return 0;
}

C.完全平方数
重点:预处理、二分函数
upper_bound() 返回在一个升序序列中第一个大于x的值的迭代器
lower_bound() 返回在一个升序序列中第一个大于等于x的值的迭代器

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,l,r;
vector<ll>v;
void init()
{
    v.push_back(0);
    for(int i=1;i*i<=1000000000;++i)
        v.push_back(i*i);//预处理
}
int main()
{
    scanf("%lld",&n);
    init();
    while(n--)
    {
        scanf("%lld%lld",&l,&r);
        ll res=upper_bound(v.begin(),v.end(),r)-lower_bound(v.begin(),v.end(),l);//二分查找
        printf("%lld\n",res);
    }
    return 0;
}
 posted on 2022-08-23 19:44  谈何功过  阅读(24)  评论(0)    收藏  举报