HDU 2081-2099

版权声明: https://blog.csdn.net/weixin_39778570/article/details/82531069

题目集合:http://acm.hdu.edu.cn/listproblem.php?vol=11
2081 手机短号

#include<bits/stdc++.h>
#define ll long long
using namespace std;

char a[15];
int t;
int main(){
    scanf("%d", &t);
    while(t--){
        scanf("%s",a);
        printf("6%s\n",a+6);
    }
    return 0;
}

2082 找单词

/*组合问题  母函数模板*/
/*
    a保存结果,b中间结果
    v权值 n1初始数量 n2终止数量 
*/
/*
#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;

int t,n,k,last,last2;
int a[51],b[51];
int v[26],n2[26];  // 权值,终止数量 
int main(){
    scanf("%d", &t);
    while(t--){
    //  memset(a,0,sizeof(a));
    //  memset(b,0,sizeof(b));
    //  memset(v,0,sizeof(v));
    //  memset(n2,0,sizeof(n2));

        fo(i, 0, 25) {
            scanf("%d", &n2[i]);
            v[i] = i+1;
        }

        a[0]=1;
        last = 0;
        fo(i,0,25){ // 第i个括号 
            last2 = min(last + n2[i]*v[i],50);    // 目前合并能达到最远项 
            memset(b,0,sizeof(int)*(last2+1));
            for(int j=0; j<=n2[i]&&j*v[i]<=last2; j++){      // 遍历第i个括号的每一项 
                for(int k=0; k<=last&&k+j*v[i]<=last2; k++){  // 遍历a的每一项 
                    b[k+j*v[i]] += a[k];
                }
            }
            memcpy(a,b,sizeof(int)*(last2+1));
            last = last2;
        }
        ll ans = 0;
        fo(i,1,50) if(a[i])ans += a[i];
        printf("%lld\n", ans);
    }
    return 0;
}c++

2083 简易版之最短距离


/*排序 然后最短距离所有点到中点的距离和*/
/*
#include<bits/stdc++.h>
#define ll long long 
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int t,n,a[550];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        fo(i,1,n)scanf("%d",&a[i]);
        sort(a+1,a+n+1);// 注意不要漏掉+1 
        int x = n/2;
        int ans = 0;
        fo(i,1,x){
            ans += a[n+1-i]-a[i];
        }
        printf("%d\n",ans);
    } 
    return 0;
} 

2084 数塔

#include<bits/stdc++.h> 
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i)
using namespace std;

int t,n,a[101][101];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        fo(i,1,n)
            fo(j,1,i)
                scanf("%d", &a[i][j]);

        for(int i=n-1; i>=1; i--)
            for(int j=1; j<=i; j++)
                a[i][j] += max(a[i+1][j], a[i+1][j+1]);

        printf("%d\n",a[1][1]);
    }
    return 0;
}

2085 核反应堆

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n;
ll sum1,sum2,t1,t2;
int main(){
    while(scanf("%d",&n) && n!=-1){
        sum1 = 1;
        sum2 = 0;
        fo(i, 1, n){
            t1 = sum1;
            t2 = sum2;
            sum1 = 3*t1+2*t2;
            sum2 = t1+t2;
        }
        printf("%lld, %lld\n", sum1, sum2);
    }
    return 0;
}

2086 A1 = ?
/纯公式推导/
/*
2*An + 2Cn - An-1 = An+1
2*An-1 + 2Cn-1 - An-2 = An

2*A2 + 2C2 - A1 = A3
2*A1 + 2C1 - A0 = A2
上面的式子左右求和,整理得:
A1 = An+1 - An + A0 -2*C(1,n) // C(1,n) 指的是c从1累加到n
对An进行同上面步骤求和,整理得:
A1 = An - An-1 + A0 -2*C(1,n-1)

A2 = A3 - A2 + A0 -2*C(1,2)
A1 = A2 - A1 + A0 -2*C(1,1)
累加得:
n*A1 = An+1 - A1 + n*A0 - 2(C(1,1)+C(1,2)+…+C(1,n))
即:
A1 = (An+1 + nA0 + 2*(n*C1+(n-1)*C2+…+2*Cn-1+1*Cn)) / n+1
*/

#include<bits/stdc++.h>
#define ll long long
#define fo(i, j, n) for(int i=j; i<=n; ++i) 
using namespace std;

int n;
double ans,c_sum,a0,an1,c;
int main(){
    while(scanf("%d",&n) != EOF){
        scanf("%lf%lf",&a0,&an1);
        c_sum = 0;
        int nn = n;
        fo(i,1,n){
            scanf("%lf",&c);
            c_sum += c * nn--;
        }
        ans = (an1+n*a0-2*c_sum) / (n+1);
        printf("%.2f\n",ans);
    }
    return 0;
}

2087 剪花布条
KMP

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

char s[1005], p[1005];
int n,m,ans,nxt[1005];
int main(){
    scanf("%s",s+1);
    while(strcmp(s+1,"#")!=0){
        scanf("%s", p+1);
        n = strlen(s+1);
        m = strlen(p+1);

        nxt[0] = -1;
        int j = -1;
        fo(i, 1, m){
            while(j>=0 && p[j+1]!=p[i]) j = nxt[j];
            nxt[i] = ++j;
        }
        j = 0;
        ans = 0;
        fo(i,1,n){
            while(j>=0 && p[j+1]!=s[i]) j = nxt[j];
            if(++j==m){
                ans++;
                j=0;
            }
        }
        printf("%d\n",ans);
        scanf("%s",s+1);
    }
    return 0;
}

2088 Box of Bricks
/注意输出格式/
/英文阅读。。。注意模拟/

#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a);
#define pf(a) printf("%lld\n", a);
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

int n,a[55],sum;
ll ans;
int main(){
    sf(n);
    while(n!=0){
        sum = 0;
        fo(i,1,n){
            sf(a[i]);
            sum += a[i];
        }
        int avg = sum/n;
        ans = 0;
        fo(i,1,n)
            if(a[i]>avg) ans += a[i]-avg;
        pf(ans); 
        sf(n);
        if(n)printf("\n");
    }
    return 0;
}

2089 不要62

/*
    sscanf(str,"%d",&a);
    sprintf(str,"%.3lf",a);
    sprintf(str,"%x",a);//10进制转换成16进制,如果输出大写的字母是sprintf(str,"%X",a)
*/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d\n", a) 
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

char str[1000010];
int a[1000010];
void init(){
    fo(i,1,1000000){
     // 数字,字符串,进制 
        sprintf(str,"%d",i);
        if(strstr(str, "4")!=NULL) { // 子串判断 
            a[i] += a[i-1]+1;
        }else if(strstr(str, "62")!=NULL) { // 子串判断 
            a[i] += a[i-1]+1; 
        }else a[i] = a[i-1];
    //  pf(a[i]);
    }
}
int n,m;
int main(){
    init();
    while(sf(n)&&sf(m) && (n!=0||m!=0)){
        pf((m-n+1)-(a[m]-a[n-1])); //  注意要减去1 
    }
    return 0;
}

2090 算菜价

#include <stdio.h>
char c[1000];
int main()
{
    double a,b,sum=0;
    while(scanf("%s%lf%lf",c,&a,&b)!=EOF)
    {
        sum+=a*b;
    }
    printf("%.1f\n",sum);
    return 0;
}

2091 空心三角形

#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%c", a) 
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

char c;
int n;
int main(){
    bool flag = 0;
    while(scanf("%c",&c) && c!='@' && sf(n)){
        getchar(); // 读取末尾换行符号 
        if(flag)pf('\n');
        flag = 1;
        int t = n-1;
        fo(j,1,t) pf(' ');pf(c);pf('\n');
        int zj = 1;
        fo(i,2,n-1){
            t--;
            fo(j,1,t) pf(' ');pf(c);
            fo(j,1,zj) pf(' ');pf(c);pf('\n');
            zj+=2;
        }
        if(n>1){fo(i,1,2*n-1)pf(c);pf('\n');} // 没判断n,wa了几次。。。 
    }   
    return 0;
}

2092 整数解

/*解一元二次方程*/
#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
int n,m;
int main(){
    while(sf(n) && sf(m) && (n||m)){
        int dt = n*n-4*m;
        if(dt<0){
            puts("No");continue; // 无解 
        }
        double x1 = (n+sqrt(dt))/2;
        double x2 = (n-sqrt(dt))/2;
        if((int)x1==x1 && (int)x2==x2)puts("Yes");  
        else puts("No");        
    }
    return 0;
}

2093 考试排名

#include<bits/stdc++.h>
#define ll long long
#define sf(a) scanf("%d",&a)
#define pf(a) printf("%d", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;
struct Student{
    char name[50];
    int sum;
    int time;   
    // 最大堆 
    bool operator < (const Student &a) const{
        if(sum==a.sum) 
            if(time==a.time)return strcmp(name,a.name)>0;
            else return time>a.time;
        else return sum < a.sum;
    }
};
// 处理一个题的成绩 
void calc(char *c, Student &st, int f){
    if(c[0]=='0' || c[0]=='-') return;
    int res = c[0]-'0';
    int len = strlen(c);
    int j = len-1;
    fo(i,1,len-1){
        if(c[i]=='('){
            j = i;
            break;
        }
        res *= 10;
        res += c[i]-'0';
    }
    int time =0;
    if(j!=len-1){
        time = c[j+1]-'0';
        fo(i,j+2,len-1){
            if(c[i]==')') break;
            time *= 10; 
            time += c[i]-'0'; 
        }
    }
    st.sum += 1;
    st.time += res+time*f;
}
int n, m;
priority_queue<Student> q;
Student stu;
char c[100];
int main(){
    cin >> n >> m;
    while(cin>>stu.name){
        stu.sum=0;
        stu.time=0;
        fo(i,1,n){
            scanf("%s",c);
            calc(c,stu,m);
        }
        q.push(stu);
    }
    while(!q.empty()){
        stu = q.top();
        q.pop();
        printf("%-10s %2d %4d\n",stu.name,stu.sum,stu.time);
    }
    return 0;
}
/*8 20
Smith  -1 -16 8 0 0 120 39 0
John 116 -2  11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0*/

2095 find your present (2)
/* 寻找出现奇数次的数,异或运算 */

#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
    char c; int sgn;
    if(c=getchar(),c==EOF)return 0; // EOF
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
    ret *= sgn;
    return 1;
}
int n,ans=0,a;
int main(){
    while(sf(n) && n){
        ans = 0;
        fo(i,1,n){
            sf(a);
            ans ^= a;
        }
        pf(ans);
    }
    return 0;
}

2096 小明A+B

#include<bits/stdc++.h>
#define ll long long
#define pf(a) printf("%d\n",a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
    char c; int sgn;
    if(c=getchar(), c==EOF) return 0; // EOF
    while(c!='-' && (c<'0'||c>'9')) c=getchar();
    sgn = (c=='-')?-1:1;
    ret = (c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0');
    ret *= sgn;
    return 1;
}
const int mod = 100;
int a,b,ans,n;
int add(int a, int b){
    a %= mod;
    b %= mod;
    return (a+b)%mod;
}
int main(){
    sf(n);
    while(n--){
        sf(a);sf(b);
        ans = add(a,b);
        pf(ans);
    }
    return 0;
}

2097 Sky数

#include<bits/stdc++.h> 
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
    char c; int sgn;
    if(c=getchar(), c==EOF) return 0; //EOF
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn = (c=='-')?-1:1;
    ret = (c=='-')?:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
    ret *= sgn;
    return 1; 
}
int sky(int a, int n){
    int res = 0;
    while(a){
        res += a%n;
        a /= n;
    }
    return res; 
} 

int n,sk10,sk12,sk16;
int main(){
    while(sf(n)&&n){
        sk10 = sky(n,10);
        sk12 = sky(n,12);
        sk16 = sky(n,16);
        if(sk10==sk12 && sk10==sk16)
            printf("%d is a Sky Number.\n",n);
        else printf("%d is not a Sky Number.\n",n);
    }
    return 0;
}

2098 分拆素数和

#include<bits/stdc++.h> 
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
    char c; int sgn;
    if(c=getchar(), c==EOF) return 0; //EOF
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn = (c=='-')?-1:1;
    ret = (c=='-')?:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
    ret *= sgn;
    return 1; 
}
const int MAXN=10000;
int prime[MAXN+1];
bool isPrime[MAXN+1];
void getPrime(){
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=MAXN; i++){
        if(!prime[i]) {
            prime[++prime[0]]=i;
            isPrime[i] = 1;
        //  cout << prime[0] << " " << i << endl;
        }
        for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++){
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)break;
        }
    } 
}
int n,ans;
int main(){
    getPrime();
    while(sf(n)&&n){
        ans = 0;    
        fo(i,1,n){
            if(prime[i]>=n/2 || prime[i]==1)break;
            if(isPrime[n-prime[i]])ans++;
        }
        pf(ans);
    }
    return 0;
}

2099 整除的尾数

#include<bits/stdc++.h> 
#define ll long long
#define pf(a) printf("%d\n", a)
#define fo(i,j,n) for(int i=j; i<=n; ++i)
using namespace std;

template <class T>
inline bool sf(T &ret){
    char c; int sgn;
    if(c=getchar(), c==EOF) return 0; //EOF
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn = (c=='-')?-1:1;
    ret = (c=='-')?:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
    ret *= sgn;
    return 1; 
}
int a, b;

int main(){
    while(sf(a)&&sf(b)&&(a||b)){
        a*=100;
        bool flat = 0;
        fo(i,0,99){
            if((a+i)%b==0){
                if(flat){
                    if(i<=9)printf(" %d%d",0,i);
                    else    printf(" %d",i);
                }else{
                    flat = 1;
                    if(i<=9)printf("%d%d",0,i);
                    else    printf("%d",i);
                }
            }
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39778570/article/details/82531069
hdu