HDU 程序设计竞赛题解(2016‘12)

19 篇文章 0 订阅
17 篇文章 0 订阅

好像没办法交题以及不知道会不会开放提交(尴尬
这里大概就存下代码和思路了:

1001

没啥好说的
找规律打一下就可以了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=1e3+10;
char s[N];
int main(){
    int t;
    scanf("%d",&t);
    getchar();
    while(t--){

        gets(s);
        if(s[14]=='?'){
            puts("-_-");
        }
        else if(s[14]=='.'){
            puts("Orz");
        }
        else{
            int cnt=0;
            for(int i=14;s[i];i++) cnt++;
            printf("W");
            while(cnt--) printf("o");
            puts("w!");
        }
    }
}
1002

数位dp:

dfs:
不知道写的对不对,反正就瞎搜一下:
从0~原数首位-1,不断搜不减位直到最后一位就ans++;
然后从原数首位开始搜,如果当前位与原数该位的数字相同,就打上标记;
搜的时候看上一位是否有标记,如果没有标记就直接往下搜;如果有标记就必须当前位的数比原数当前位小or等于才能继续搜;
直到最后一位也满足条件ans++;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
char s[10];
int a[10];
int vis[10];
int ans,cnt;
void dfs1(int x,int d){
    if(vis[d-1]&&x>a[d]) return;    

    if(d==cnt){
        ans++;
        return ;
    }
    if(x==a[d]) vis[d]=1;
    for(int i=0;i<10;i++){
        if(i>=x){
            dfs1(i,d+1);
        }
    }

}
void dfs(int x,int d){
    if(d==cnt){
        ans++;
        return;
    }

    for(int i=0;i<10;i++){
        if(i>=x){
            dfs(i,d+1);
        }
    }
}
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%s",&s);
        ans=0;
        for(cnt=0;s[cnt];cnt++){
            a[cnt+1]=s[cnt]-'0';
        }   
        memset(vis,0,sizeof(vis));

        dfs1(a[1],1);

        for(int i=0;i<a[1];i++){
            dfs(i,1);
        }       

        ans--;

        printf("%d\n",ans);

    }
}
1003

贪心?(其实是瞎搞
先把需要清洗的衣服中10件10件的丢去清洗,然后考虑剩下来的情况
(剩下来就是(n-m)%10,0<(n-m)%10<10)
如果剩下来的全是待脱水的,直接全部3件一脱水,最后有多的再脱一次
如果剩下来的总和(待清洗+待脱水)>=10,那么就直接洗10件,然后剩下的脱水(因为待清洗的一定<10)
(这里要明确,洗衣服一定是多的洗划算)
总和>=6,直接洗6件,再脱水;
总和>=3,直接洗3件,再脱水;
总和<3,直接洗三件即可;
我的版本重复代码太多啦,不过完全是按照这样的思路去写的

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        int n,m;
        scanf("%d %d",&n,&m);
        int sum=0;
        int rest=n-m;

        sum+=rest/10*4;
        rest%=10;

        if(rest==0) {
            sum+=m/3;
            if(m%3) sum+=1;
        } else if(rest+m>=10) {
            sum+=4;
            m-=(10-rest);
            sum+=m/3;
            if(m%3) sum+=1;
        } else if(rest+m>=6) {
            sum+=3;
            m-=(6-rest);
            sum+=m/3;
            if(m%3) sum+=1;
        } else if(rest+m>=3) {
            sum+=2;
            m-=(3-rest);
            sum+=m/3;
            if(m%3) sum+=1;
        }else{
            sum+=2;
        }
        printf("%d\n",sum);
    }
}
1004

dfs:
记录一下每张卡片的数目
然后dfs考虑只要存在就每张卡片-1的情况,四个方向搜一下
不断让当前值和之前记录的ans取大者
最后比较一下m与ans
觉得自己想的没问题吼

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
char s[10];
int ans,now;
int f1,i1,d1,e1;
void dfs(int fc,int ic,int dc,int ec,int tot){
    if(tot<0){
        return;
    }
    else now=(6+(e1-ec)*2+d1-dc)*(f1-fc)+(3+(e1-ec)*2+d1-dc)*(i1-ic);

    ans=max(ans,now);

    if(tot==0) return;

    if(fc>0) dfs(fc-1,ic,dc,ec,tot-4);
    if(ic>0) dfs(fc,ic-1,dc,ec,tot-2);
    if(dc>0) dfs(fc,ic,dc-1,ec,tot-2);
    if(ec>0) dfs(fc,ic,dc,ec-1,tot-4);



}

int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        int n,m;
        scanf("%d %d",&n,&m);
        ans=0;
        int fc=0,ic=0,dc=0,ec=0;
        for(int i=1; i<=n; i++) {
            scanf("%s",s);
            if(s[0]=='F') fc++;
            else if(s[0]=='I') ic++;
            else if(s[0]=='D') dc++;
            else ec++;
        }
        f1=fc,i1=ic,d1=dc,e1=ec;
        dfs(fc,ic,dc,ec,10);
        if(ans>=m) puts("Yes");
        else puts("No");


    }
}

或者直接把情况列举出来……

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
char s[10];
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        int n,m;
        scanf("%d %d",&n,&m);
        int fc=0,ic=0,dc=0,ec=0;
        for(int i=1; i<=n; i++) {
            scanf("%s",s);
            if(s[0]=='F') fc++;
            else if(s[0]=='I') ic++;
            else if(s[0]=='D') dc++;
            else ec++;
        }

        if(fc==0&&ic==0) puts("No");
        else if(ic>=1&&m<=3) puts("Yes");
        else if(ic>=2&&m<=6) puts("Yes");
        else if(ic>=3&&m<=9) puts("Yes");
        else if(ic>=4&&m<=12)puts("Yes");
        else if(ic>=5&&m<=15)puts("Yes");

        else if(fc>=1&&m<=6)puts("Yes");
        else if(fc>=2&&m<=12)puts("Yes");

        else if(ic>=1&&fc>=1&&m<=9)puts("Yes");
        else if(ic>=1&&fc>=2&&m<=15)puts("Yes");
        else if(ic>=2&&fc>=1&&m<=12)puts("Yes");
        else if(ic>=3&&fc>=1&&m<=15)puts("Yes");

        else if(fc>=1&&dc>=1&&m<=7)puts("Yes");
        else if(fc>=1&&dc>=2&&m<=8)puts("Yes");
        else if(fc>=1&&dc>=3&&m<=9)puts("Yes");
        else if(fc>=2&&dc>=1&&m<=14)puts("Yes");

        else if(ic>=1&&ec>=1&&m<=5)puts("Yes");
        else if(ic>=1&&ec>=2&&m<=7)puts("Yes");
        else if(ic>=2&&ec>=1&&m<=10)puts("Yes");
        else if(ic>=3&&ec>=1&&m<=15)puts("Yes");

        else if(fc>=1&&ec>=1&&m<=8)puts("Yes");

        else if(ic>=1&&dc>=1&&ec>=1&&m<=6)puts("Yes");
        else if(ic>=2&&dc>=1&&ec>=1&&m<=12)puts("Yes");
        else if(ic>=1&&dc>=2&&ec>=1&&m<=7)puts("Yes");

        else if(fc>=1&&dc>=1&&ec>=1&&m<=9)puts("Yes");

        else if(fc>=1&&ic>=1&&ec>=1&&m<=13)puts("Yes");
        else if(fc>=1&&ic>=1&&dc>=1&&m<=11)puts("Yes");
        else if(fc>=1&&ic>=1&&dc>=2&&m<=13)puts("Yes");
        else if(fc>=1&&ic>=2&&dc>=1&&m<=15)puts("Yes");

        else if(ic>=1&&dc>=1&&m<=4) puts("Yes");
        else if(ic>=1&&dc>=2&&m<=5) puts("Yes");
        else if(ic>=1&&dc>=3&&m<=6) puts("Yes");
        else if(ic>=1&&dc>=4&&m<=7) puts("Yes");
        else if(ic>=2&&dc>=1&&m<=8) puts("Yes");
        else if(ic>=2&&dc>=2&&m<=10) puts("Yes");
        else if(ic>=2&&dc>=3&&m<=12) puts("Yes");
        else if(ic>=3&&dc>=1&&m<=12) puts("Yes");
        else if(ic>=3&&dc>=2&&m<=15) puts("Yes");
        else if(ic>=4&&dc>=1&&m<=16) puts("Yes");
        else puts("No");

    }
}
1007

sort然后不断头尾相减
a[2*n]-a[1] a[2*n-1]-a[2]…

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=1e3+10;
int a[2*N];
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=2*n;i++){
            scanf("%d",&a[i]);
        }
        sort(a+1,a+2*n+1);
        int sum=0;
        for(int i=1,j=2*n;i<=n;i++,j--){
            sum+=(a[j]-a[i]);
        }
        printf("%d\n",sum);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值