201609-3 炉石传说
理解题目就好写,就是代码长,思路很简单。
按两个玩家交替输入指令,分别用两个结构体数组记录两个玩家的生命和随从,attack时进行相应处理即可。
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include <string>
#include <bits/stdc++.h>
#include <vector>
#include <sstream>
using namespace std;
#define N 1005
int n,m;
long long sum=0;
typedef struct {
int flag;
int attack;
int health;
}node;
int main(){
cin>>n;
string action;
int arg1,arg2,arg3;
node fnode[8],snode[8];
fnode[0].health=30;
fnode[0].attack=0;
snode[0].health=30;
snode[0].attack=0;
for(int i=0;i<9;i++){
fnode[i].flag=0;
snode[i].flag=0;
}
int index=0;
for(int i=0;i<n;i++){
cin>>action;
if(action=="summon"){
cin>>arg1>>arg2>>arg3;
if(index%2==0){//先手玩家
if(fnode[arg1].flag){
for(int j=7;j>arg1;j--) fnode[j]=fnode[j-1];
}
fnode[arg1].flag=1;
fnode[arg1].attack=arg2;
fnode[arg1].health=arg3;
}else{//后手玩家
if(snode[arg1].flag){
for(int j=7;j>arg1;j--) snode[j]=snode[j-1];
}
snode[arg1].flag=1;
snode[arg1].attack=arg2;
snode[arg1].health=arg3;
}
}else if(action=="attack"){
cin>>arg1>>arg2;
if(index%2==0){//先手
fnode[arg1].health-=snode[arg2].attack;
snode[arg2].health-=fnode[arg1].attack;
if(fnode[arg1].health<=0&&arg1){
for(int j=arg1;j<7;j++) fnode[j]=fnode[j+1];
fnode[7].flag=0;
}
if(snode[arg2].health<=0&&arg2){
for(int j=arg2;j<7;j++) snode[j]=snode[j+1];
snode[7].flag=0;
}
}else{//后手
snode[arg1].health-=fnode[arg2].attack;
fnode[arg2].health-=snode[arg1].attack;
if(snode[arg1].health<=0&&arg1){
for(int j=arg1;j<7;j++) snode[j]=snode[j+1];
snode[7].flag=0;
}
if(fnode[arg2].health<=0&&arg2){
for(int j=arg2;j<7;j++) fnode[j]=fnode[j+1];
fnode[7].flag=0;
}
}
}else{
index++;
}
if(fnode[0].health<=0||snode[0].health<=0) break;
}
if(fnode[0].health>0&&snode[0].health<=0) cout<<1<<endl;
else if(fnode[0].health<=0&&snode[0].health>0) cout<<-1<<endl;
else cout<<0<<endl;
cout<<fnode[0].health<<endl;
int fnum=0,snum=0;
for(int i=1;i<8;i++){
if(fnode[i].flag&&fnode[i].health>0) fnum++;
if(snode[i].flag&&snode[i].health>0) snum++;
}
cout<<fnum<<' ';
for(int i=1;i<8;i++){
if(fnode[i].flag&&fnode[i].health>0) cout<<fnode[i].health<<' ';
}
cout<<endl;
cout<<snode[0].health<<endl;
cout<<snum<<' ';
for(int i=1;i<8;i++){
if(snode[i].flag&&snode[i].health>0) cout<<snode[i].health<<' ';
}
system("pause");
return 0;
}
//
201612-1 中间数
暴力求解
int n;
int main(){
cin>>n;
int a[1005],temp,small=0,large=0,flag=0;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
small=0,large=0;
temp=a[i];
for(int j=0;j<n;j++){
if(a[j]>temp) large++;
if(a[j]<temp) small++;
}
if(small==large){
flag=1;
cout<<temp;
break;
}
}
if(!flag) cout<<-1;
return 0;
}
//
201612-2 工资计算
区间搞错,两次才通过
int main(){
cin>>n;
int salary=0,after=0;
if(n>3500){
for(int i=35;i<1001;i++){
after=0;
salary=100*i;
salary-=3500;
if(salary<=1500) after=salary-salary*0.03;
else if(salary<=4500) after=salary-1500*0.03-(salary-1500)*0.1;
else if(salary<=9000) after=salary-1500*0.03-3000*0.1-(salary-4500)*0.2;
else if(salary<=35000) after=salary-1500*0.03-3000*0.1-4500*0.2-(salary-9000)*0.25;
else if(salary<=55000) after=salary-1500*0.03-3000*0.1-4500*0.2-26000*0.25-(salary-35000)*0.3;
else if(salary<=80000) after=salary-1500*0.03-3000*0.1-4500*0.2-26000*0.25-20000*0.3-(salary-55000)*0.35;
else after=salary-1500*0.03-3000*0.1-4500*0.2-26000*0.25-20000*0.3-25000*0.35-(salary-80000)*0.45;
if((after+3500)==n){
cout<<salary+3500;
break;
}
}
}else cout<<n;
return 0;
}
//