CCF-2016/9/11

CCF认证

还是代码能力太差

第一个,水

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
const int MAXN = 1010;
int a[MAXN];
int main(){
	int ans = -1;
	scanf("%d",&n);
	scanf("%d",&a[1]);
	for(int i=2;i<=n;i++){
		scanf("%d",&a[i]);
		int tmp = abs(a[i]-a[i-1]);
		ans = max(ans,tmp);
	}
	cout<<ans<<endl;
	return 0;
}

第二题,暴力就好,图很小

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,du;
int head[22];
int mp[22][8];
void ini(){
	for(int i=1;i<=20;i++) head[i] = 5;
	memset(mp,0,sizeof mp);
}
int main(){
	ini();
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
        scanf("%d",&du);
        int flag = 1;
        for(int j=1;j<=20;j++){
            if(head[j]>=du) {
                int st = 0;
                for(int k=1;k<=5;k++){
                    if(mp[j][k] == 0){
                        for(int d=1;d<=du;d++){
							mp[j][k+d-1] = 1;
                            if(d==1) printf("%d",5*(j-1)+k+d-1);
							else printf(" %d",5*(j-1)+k+d-1);
                        }
						head[j] -= du;
						break;
                    }
                }
                flag = 0;
                break;
            }
        }
        if(flag){
			int cnt = 0;
            for(int i=1;i<=20;i++){
				for(int j=1;j<=5;j++) {
					if(mp[i][j] == 0) {
						head[i] -- ;
						mp[i][j] = 1;
						if(cnt == 0) printf("%d",(5*(i-1)+j));
						else printf(" %d",(5*(i-1)+j));
					}
				}
            }
        }
        puts("");
	}
	return 0;
}
第三题,模拟,一开始把问题看错真心要命

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

using namespace std;
int n;
char ch[30];
struct People{
	int life;
	int attack;
	void get(int ll,int aa){
		life = ll;
		attack = aa;
	}
};
struct Hero{
	People p[10];
	bool vis[10];
	int cnt;
	int life;
	void ini(){
		cnt = 0;
		life = 30;
		memset(vis,false,sizeof vis);
        memset(p,0,sizeof p);
	}
    void getpeople(People pp,int pos){
    	cnt ++;
        for(int i=cnt;i>=pos+1;i--){
			p[i] = p[i-1];
        }
        p[pos] = pp;
    }
    void removepeople(int pos){
		cnt --;
        for(int i=pos;i<=cnt;i++){
			p[i] = p[i+1];
        }
    }
}hero[2];
void debug(){
	cout<<"----------------"<<endl;
	for(int i=0;i<2;i++){
		cout<<"hero "<<i<<endl;
		cout<<hero[i].life<<endl;
		cout<<hero[i].cnt;
		for(int j=1;j<=hero[i].cnt;j++){
			cout<<"pos = "<<j<<" life = "<<hero[i].p[j].life<<" attack = "<<hero[i].p[j].attack<<" ";
		}
		cout<<endl;
	}
	cout<<"----------------"<<endl;
}
int main(){
	scanf("%d",&n);
//	cout<<"n = "<<n<<endl;
//	getchar();
	int flag = 0;
	int who = 0;
	for(int i=0;i<2;i++) hero[i].ini();
	for(int ca = 1;ca <= n;ca++){
		scanf("%s",ch);

		if(strcmp(ch,"end")==0){
			who = 1-who;
		}
		else if(strcmp(ch,"summon")==0){
			int pos,attack,health;
			People tmp;
			scanf("%d%d%d",&pos,&attack,&health);
			tmp.get(health,attack);
			hero[who].getpeople(tmp,pos);
//			cout<<"man : "<<who<<endl;
//			cout<<"pos : "<<pos<<endl;
//			cout<<"debug: "<<hero[who].p[pos].life<<endl;
		}
		else if(strcmp(ch,"attack")==0){
			if(flag) continue;
			int pos,defender;
			int en = 1-who;
			People tmp;
			scanf("%d%d",&pos,&defender);
			int attack1 = hero[who].p[pos].attack;
			if(defender == 0){
				hero[who].p[pos].life -= attack1;
				hero[en].life -= attack1;
				if(!flag && hero[en].life<=0){
					if(en == 1) flag = -1;
					else flag = 1;
				}
			}
			else {
				int attack2 = hero[en].p[defender].attack;
				hero[who].p[pos].life -= attack2;
				hero[en].p[defender].life -= attack1;
				if(hero[en].p[defender].life<=0){
					hero[en].removepeople(defender);
				}
				if(hero[who].p[pos].life<=0){
					hero[who].removepeople(pos);
				}
			}
		}
		//debug();
	}
	cout<<flag<<endl;
	for(int i=0;i<2;i++){
		//cout<<"hero "<<i+1<<endl;
		cout<<hero[i].life<<endl;
		cout<<hero[i].cnt;
		for(int j=1;j<=hero[i].cnt;j++){
			cout<<" "<<hero[i].p[j].life;
		}
		cout<<endl;
	}
	return 0;
}
第四题,图论,中间记录点之间有多少个是用MAP搞的,能过多少不知道

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;
const int MAXN = 10010;
const int MAXE = 100010;
const int INF = 0x3f3f3f3f;
int n,m;
int pre[MAXN];
int dist[MAXN];
bool vis[MAXN];
map<pair<int,int>,int>mp;
struct qnode{
	int v,c;
	qnode(int vv=0,int cc=0):v(vv),c(cc){}
	bool operator < (const qnode &r)const{
		return c>r.c;
	}
};
struct Edge{
	int v,cost;
    Edge(int vv=0,int ccost=0):v(vv),cost(ccost){}
};
vector<Edge>E[MAXN];
inline void addedge(int u,int v,int w){
	E[u].push_back(Edge(v,w));
}
int ans;
void Dijkstra(){
	memset(vis,false,sizeof vis);
	memset(pre,0,sizeof pre);
	int start = 1;
	for(int i=1;i<=n;i++) dist[i] = INF;
    priority_queue<qnode>que;
    while(!que.empty()) que.pop();
    dist[start] = 0;
    qnode tmp;
    que.push(qnode(start,0));
    while(!que.empty()){
        tmp = que.top();
        que.pop();
        int u = tmp.v;
        if(vis[u]) continue;
        vis[u] = true;
        for(int i=0;i<E[u].size();i++){
			int v = E[tmp.v][i].v;
            int cost = E[u][i].cost;

            if(vis[v]) continue;
            if(dist[v]>dist[u]+cost){
				dist[v] = dist[u] + cost;
				que.push(qnode(v,dist[v]));
				pre[v] = u;
            }
            if(dist[v] == dist[u]+cost){
				int lenp = mp[make_pair(pre[v],v)];
				int lenu = mp[make_pair(u,v)];
				if(lenp>lenu) pre[v] = u;
            }
        }
    }
}
int main(){
	int u,v,w;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) E[i].clear();
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		addedge(u,v,w);
		addedge(v,u,w);
		mp[make_pair(u,v)] = w;
		mp[make_pair(v,u)] = w;
	}
	ans = 0;
	Dijkstra();
    for(int i=2;i<=n;i++){
		ans += mp[make_pair(pre[i],i)];
    }
    printf("%d\n",ans);
	return 0;
}

第五题还是有一点问题,回头再看吧。。。


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值