A - A Math Problem

 HDU - 6182 

You are given a positive integer n, please count how many positive integers k satisfy kk≤n. 

InputThere are no more than 50 test cases. 

Each case only contains a positivse integer n in a line. 

kk≤n in a line.
Sample Input

1
4

Sample Output

1
2

A是最好做的,找到那个最大的数,15吧

写快速幂只是不想循环,感觉也很麻烦

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll la(int n)
{
    ll ans=1,base=n;
    while(n)
    {
        if(n&1)ans=ans*base;
        n>>=1,base=base*base;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    ll n;
    while(cin>>n)
    {
        int i;
        for(i=1;i<16;i++)
            if(la(i)>n)break;
        cout<<i-1<<"\n";
    }
    return 0;
}

E - CS Course

 HDU - 6186 

Little A has come to college and majored in Computer and Science. 

Today he has learned bit-operations in Algorithm Lessons, and he got a problem as homework. 

Here is the problem: 

You are giving n non-negative integers ap. 

InputThere are no more than 15 test cases. 

Each test case begins with two positive integers n and p 
in a line, indicate the number of positive integers and the number of queries. 

ap in a line. 
Sample Input

3 3
1 1 1
1
2
3

Sample Output

1 1 0
1 1 0
1 1 0

让你求n个数除x这个数的按位与和按位或还有异或和,明明前缀后缀最方便,sb写了一个统计二进制位的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[N],num[31],f[31];
int la(int n)
{
    int i=0;
    while(n)
    {
        if(n&1)num[i]++;
        n>>=1,i++;
    }
}
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,q;
    while(cin>>n>>q)
    {
        int xor1=0;
        memset(num,0,sizeof num);
        for(int i=0; i<n; i++)
            cin>>a[i],xor1^=a[i];
        for(int i=0; i<n; i++)la(a[i]);
        while(q--)
        {
            int x;
            cin>>x;
            x--;
            for(int i=0; i<31; i++)
                f[i]=num[i];
            int i=0;
            int t=a[x];
            while(t)
            {
                if(t&1)f[i]--;
                t>>=1,i++;
            }
            int and1=0,or1=0;
            for(int i=30;i>=0;i--)
            {
                and1=and1*2+(f[i]==n-1);
                or1=or1*2+(f[i]!=0);
            }
            cout<<and1<<" "<<or1<<" "<<(xor1^a[x])<<"\n";
        }
    }
    return 0;
}

G - Duizi and Shunzi

 HDU - 6188 

Nike likes playing cards and makes a problem of it. 

Now give you n integers, max(s). 

Each number can be used only once. 

InputThe input contains several test cases. 

For each test case, the first line contains one integer n(1≤ai≤n) 
OutputFor each test case, output the answer in a line. 
Sample Input

7
1 2 3 4 5 6 7
9
1 1 1 2 2 2 3 3 3
6
2 2 3 3 3 3 
6
1 2 3 3 4 5

Sample Output

2
4
3
2


        
 

Hint

Case 1(1,2,3)(4,5,6)

Case 2(1,2,3)(1,1)(2,2)(3,3)

Case 3(2,2)(3,3)(3,3)

Case 4(1,2,3)(3,4,5)

贪心组对子和顺子就好了

#include<bits/stdc++.h>
using namespace std;
int n,x,a[1000005];
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof a);
        int sum=0;
        for(int i=0;i<n;i++)
            scanf("%d",&x),a[x]++;
        for(int i=1;i<n-1;i++)
        {
            sum+=a[i]/2;
            a[i]%=2;
            sum+=a[i+1]/2;
            a[i+1]%=2;
            if(a[i]&&a[i+1]&&a[i+2])
            {
                sum++;
                a[i]--;
                a[i+1]--;
                a[i+2]--;
            }
        }
        printf("%d\n",sum+a[n-1]/2+a[n]/2);
    }
    return 0;
}

我是只考虑第一张的

#include <stdio.h>
#include <string.h>
const int N=1e5+5;
int a[N];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(int)*(n+5));
        for(int i=0; i<n; i++)
        {
            int x;
            scanf("%d",&x);
            a[x]++;
        }
        int ans=0;
        for(int i=1; i<n-1; i++)
        {
            ans+=a[i]/2;
            if(a[i]&1&&a[i+1]&1&&a[i+2])
            {
                ans++;
                a[i+1]--;
                a[i+2]--;
            }
        }
        ans+=a[n-1]/2+a[n]/2;
        printf("%d\n",ans);
    }
    return 0;
}

D - Covering

 HDU - 6185 

Bob's school has a big playground, boys and girls always play games here after school. 

To protect boys and girls from getting hurt when playing happily on the playground, rich boy Bob decided to cover the playground using his carpets. 

Meanwhile, Bob is a mean boy, so he acquired that his carpets can not overlap one cell twice or more. 

He has infinite carpets with sizes of 4×n. 

Can you tell Bob the total number of schemes where the carpets can cover the playground completely without overlapping? 

InputThere are no more than 5000 test cases. 

Each test case only contains one positive integer n in a line. 

1≤n≤1018 
OutputFor each test cases, output the answer mod 1000000007 in a line. 
Sample Input

1
2

Sample Output

1
5

暴力算几项,肯定是前四项推出来第五项的,

暴力跑一下

然后暴力猜系数,矩阵快速幂

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MD=1e9+7;
int A[5]={0,1,5,11,36};
struct Matrix
{
    ll a[4][4];
    Matrix()
    {
        memset(a,0,sizeof(a));
    }
    Matrix operator*(const Matrix  y)
    {
        Matrix  ans;
        for(int i=0; i<4; i++)
            for(int j=0; j<4; j++)
                for(int k=0; k<4; k++)
                    ans.a[i][j]=(ans.a[i][j]+a[i][k]*y.a[k][j]+MD)%MD;
        return ans;
    }
    void operator=(const Matrix b)
    {
        for(int i=0; i<4; i++)
            for(int j=0; j<4; j++)
                a[i][j]=b.a[i][j];
    }
};
ll la(ll x)
{
    Matrix ans,t;
    t.a[0][0]=t.a[0][1]=t.a[1][2]=t.a[2][3]=t.a[2][0]=1;
    t.a[3][0]=-1,t.a[1][0]=5;
    ans.a[0][0]=36,ans.a[0][1]=11,ans.a[0][2]=5,ans.a[0][3]=1;
    while(x)
    {
        if(x&1)ans=ans*t;
        t=t*t;
        x>>=1;
    }
    return ans.a[0][0];
}
int main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    ll n;
    while(cin>>n)
    {
        if(n<5)cout<<A[n]<<"\n";
        else
            cout<<la(n-4)<<"\n";
    }
    return 0 ;
}

 

相关文章:

  • 2021-12-18
  • 2021-04-25
  • 2022-12-23
  • 2022-12-23
  • 2021-04-15
  • 2022-12-23
  • 2022-12-23
  • 2021-07-10
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-22
  • 2021-11-20
  • 2022-12-23
相关资源
相似解决方案