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;
}
第五题还是有一点问题,回头再看吧。。。