2019.03.13更新:补充G题及以后的AC代码,题解日后补充。
A.内蒙创业
题目链接:https://www.bttcacm.cn/problem.php?id=1021
简单判断是否符合条件即可
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
char a[100];
cin>>a;
int flag=1;
if(a[0]!='L' || a[1]!='Q')
flag=0;
if(strlen(a)!=10)
flag=0;
for(int i=2;i<10;i++)
if(a[i]<'0' || a[i]>'9')
flag=0;
if(flag)
cout<<"YES\n";
else
cout<<"NO\n";
}
return 0;
}
B.涮羊肉
题目链接:https://www.bttcacm.cn/problem.php?id=1022
首先处理出所有肉变得美味的时刻,对它们从小到大排序,使用贪心策略,一旦可以捞肉就捞。这样就可以使每次可以捞肉的起始时间尽量早。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
int t;
while(cin>>t){
int a[5000];
bool vis[5000];
while(t--){
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
int n,m;
cin>>n>>m;
for(int i=0;i<n; i++){
int x,y;
cin>>x>>y;
a[i] = x+y;
}
sort(a,a+n);
int sum = 0;
for(int i=a[0]; i<=a[n-1]; i++){
for(int j=0; j<n; j++){
if(i == a[j] && !vis[a[j]]){
vis[a[j]] = 1;
sum++;
i+=m;
}
}
}
cout<<sum<<endl;
}
}
return 0;
}
C.狙击敌人
题目链接:https://www.bttcacm.cn/problem.php?id=1023
判断斜率和方向即可
#include<iostream>
#include<cstring>
#include<string>
#include<math.h>
using namespace std;
int sgn(int x){
return x<0?x==0?0:1:-1;
}
int main(){
int t;
while(cin>>t){
while(t--){
int flag=1;
int x1,y1,x2,y2,dx,dy;
cin >> x1 >> y1 >> x2 >> y2 >> dx >> dy;
if((x2-x1)*(dy)-(y2-y1)*(dx)!=0)
flag=0;
if(sgn(dx)!=sgn(x2-x1) || sgn(dy)!=sgn(y2-y1))
flag=0;
if(flag)
cout << "YES" << '\n';
else
cout << "NO" << '\n';
}
}
return 0;
}
D.医疗兵
题目链接:https://www.bttcacm.cn/problem.php?id=1024
动态规划,有七种转移:
- 用1个医疗包
- 用1个医疗包和1个饮料
- 用1个饮料
- 用2个饮料
- 用3个饮料
- 用4个饮料
- 什么都不用
特别感谢:武耗子
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX(a,b,c,e,d,f,g) max(a,max(b,max(c,max(d,max(e,max(f,g))))))
#define _INF -0x7fffffff
using namespace std;
int dp[105][105][105];
int que[105];
int n;
int t;
int main(){
cin>>t;
while(t--){
int a,b;
memset(dp,0,sizeof(dp));
memset(que,0,sizeof(que));
scanf("%d%d%d",&a,&b,&n);
for(int i=1;i<=n;++i)
scanf("%d",&que[i]);
for(int i=0;i<=a;++i)
for(int j=0;j<=b;++j)
dp[0][i][j]=100;
int t=0,ans=0;
for(int i=1;i<=n;++i){
int c=t;
for(int j=0;j<=a;++j){
for(int k=0;k<=b;++k){
dp[i][j][k]=MAX(
dp[i-1][j][k]-que[i],
(j>0&&dp[i-1][j-1][k]>0&&dp[i-1][j-1][k]<=70)? 70-que[i]:_INF,
(dp[i-1][j-1][k-1]>0&&j>0&&k>0&&dp[i-1][j-1][k-1]<=70)? 100-que[i]:_INF,
(k>0&&dp[i-1][j][k-1]>0)? (dp[i-1][j][k-1]>70? 100-que[i]:dp[i-1][j][k-1]+30-que[i]):_INF,
(k>1&&dp[i-1][j][k-2]>0)? (dp[i-1][j][k-2]>40? 100-que[i]:dp[i-1][j][k-2]+60-que[i]):_INF,
(k>2&&dp[i-1][j][k-3]>0)? (dp[i-1][j][k-3]>10? 100-que[i]:dp[i-1][j][k-3]+90-que[i]):_INF,
(k>3&&dp[i-1][j][k-4]>0)? (100-que[i]):_INF
);
if(dp[i][j][k]>0)t++;
}
}
if(c!=t)ans=max(ans,i);
}
cout<<ans<<endl;
}
return 0;
}
E.逃离机场
题目链接:https://www.bttcacm.cn/problem.php?id=1025
BFS
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct step
{
int r,c;
int time;
step(int a,int b, int cc):
r(a),c(b),time(cc){}
step(){};
};
queue <step> q;
int b[4][2] = {0,-1,0,1,1,0,-1,0};
step start;
int main()
{
int t;
while(cin>>t)
{
while(t--)
{
char s[210][210];
bool vis[210][210];
int n,m;
cin>>n>>m;
memset(s,'#',sizeof(s));
memset(vis,0,sizeof(vis));
while(!q.empty())
q.pop();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>s[i][j];
if(s[i][j] == '@')
start = step(i,j,0);
}
}
//cout<<endl<<endl;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(s[i][j] == 'o')
{
for(int k=i;k>=1;k--)
{
if(s[k][j]=='x')
break;
if(s[k][j]=='.'||s[k][j]=='@')
s[k][j]='O';
}
for(int k=i;k<=n;k++)
{
if(s[k][j]=='x')
break;
if(s[k][j]=='.'||s[k][j]=='@')
s[k][j]='O';
}
for(int k=j;k>=1;k--)
{
if(s[i][k]=='x')
break;
if(s[i][k]=='.'||s[i][k]=='@')
s[i][k]='O';
}
for(int k=j;k<=m;k++)
{
if(s[i][k]=='x')
break;
if(s[i][k]=='.'||s[i][k]=='@')
s[i][k]='O';
}
}
}
}
bool flag = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(s[i][j] == '@')
flag = 1;
if(!flag)
{
cout<<"no zuo no die!"<<'\n';
continue ;
}
/*for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cout<<s[i][j];
}
cout<<endl;
}
cout<<endl<<endl;*/
q.push(start);
vis[start.r][start.c] = 1;
step ps;
while(!q.empty())
{
ps = q.front();
if(s[ps.r][ps.c] == '#')
{
break;
}
q.pop();
for(int k=0; k<4; k++)
{
int r = ps.r + b[k][0], c = ps.c + b[k][1];
if(s[r][c] == 'o' || s[r][c] == 'O' || s[r][c] == 'x')
continue ;
if(!vis[r][c] )
{
q.push(step(r,c,ps.time+1));
vis[r][c] = 1;
}
}
}
if(q.empty())
cout<<"no zuo no die!"<<'\n';
else
cout<<ps.time<<'\n';
}
}
return 0;
}
F.洗衣服
题目链接:https://www.bttcacm.cn/problem.php?id=1026
模拟
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int main(){
int T;
while(scanf("%d",&T)!=EOF){
while(T--){
int n,m;
scanf("%d%d",&n,&m);
int ti[150];
memset(ti,0,sizeof(ti));
int q[1500];
for(int u=0;u<m;u++){
scanf("%d",&q[u]);
}
int head=0;
int i;
for(i=0;;i++){
for(int j=0;j<n;j++){
if(q[head]<=i && ti[j]==i && head<m){
ti[j]+=45;
head++;
}
}
int flag=1;
for(int j=0;j<n;j++){
if(ti[j]>i)
flag=0;
}
for(int j=0;j<n;j++){
if(ti[j]==i)
ti[j]=i+1;
}
if(flag==1 && head==m)
break;
}
printf("%d\n",i);
}
}
return 0;
}
G.哥本哈根妖
题目链接:https://www.bttcacm.cn/problem.php?id=1027
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
double const exp1=0.0000000001;
struct node
{
int x;
double t,p,tx;
};
struct node s[105];
bool cmp(node a, node b)
{
if(fabs(a.tx - b.tx) > exp1 )
return a.tx > b.tx;
else
return a.x < b.x;
}
int main()
{
int i,n,t;
while(scanf("%d",&t) != EOF)
{
while(t --)
{
scanf("%d",&n);
for(i = 0; i < n; i ++)
scanf("%lf",&s[i].t);
for(i = 0; i < n; i ++)
{
scanf("%lf",&s[i].p);
s[i].x = i + 1;
s[i].tx = s[i].p / s[i].t;
}
sort(s,s+n,cmp);
for(i = 0; i < n; i ++)
{
if(i != 0)
printf(" ");
printf("%d",s[i].x);
}
printf("\n");
}
}
return 0;
}
H.公孙玉龙
题目链接:https://www.bttcacm.cn/problem.php?id=1028
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
char bianliang[105][105];
char value[105][105];
int len;
char temp[105][105];
int icount=0;
char a[105],b[105];
void fz(char t[],int index){
if((t[0]>='A' && t[0]<='Z')||(t[0]>='a' && t[0]<='z')){
for(int i=0;i<len;i++){
if(!strcmp(bianliang[i],t)){
fz(value[i],index);
//strcpy(value[index],value[i]);
}
}
}
else{
strcpy(value[index],t);
}
return;
}
int main(){
int T;
while(scanf("%d",&T)!=EOF){
while(T--){
memset(bianliang,0,sizeof(bianliang));
memset(value,0,sizeof(value));
len = 0;
memset(temp,0,sizeof(temp));
icount=0;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",a);
scanf("%s",b);
int flag=0;
int j;
for(j=0;j<len;j++){
if(!strcmp(a,bianliang[j])){
fz(b,j);
flag=1;
break;
}
}
if(!flag){
strcpy(bianliang[len++],a);
fz(b,j);
}
/*for(int i=0;i<len;i++)
printf("<%s> <%s>\n",bianliang[i],value[i]);
printf("---------------\n");*/
}
//for(int i=0;i<len;i++)
// printf("<%s> <%s>\n",bianliang[i],value[i]);
for(int i=0;i<len;i++){
int flag=0;
int j;
for(j=0;j<icount;j++){
if(!strcmp(temp[j],value[i])){
flag=1;
break;
}
}
if(!flag){
strcpy(temp[icount++],value[i]);
}
}
printf("%d\n",icount);
}
}
return 0;
}
I.米波
题目链接:https://www.bttcacm.cn/problem.php?id=1029
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
long long int dp[10000];
long long int const MOD=1e9+7;
int main(){
int T,k,m,t;
cin >> T;
while(T--){
memset(dp,0,sizeof(dp));
dp[0]=1;
cin >> k >> m >> t;
for(int i=1;i<=t;i++){
long long int q=0;
for(int j=i-m+1;j<=i-k;j++){
q+=j<0?0:dp[j];
q%=MOD;
}
dp[i]=q%MOD;
}
long long int sum=0;
for(int i=2;i<=t;i++){
dp[i]+=dp[i-1];
dp[i]%=MOD;
}
sum=dp[t]-dp[t-m];
if(sum<0)
sum+=MOD;
cout << sum << '\n';
}
return 0;
}
J.瑞秋
题目链接:https://www.bttcacm.cn/problem.php?id=1030
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int a[100][90];
int t;
cin>>t;
while(t--){
memset(a,0,sizeof(a));
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
scanf("%d",&a[i][j]);
int n;
cin>>n;
int sum=0;
int x,y;
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
if(a[i][j]==3){
x=i;
y=j;
break;
}
for(int i=x-1;i>=0;i--){
if(a[i][y]==1)
break;
if(a[i][y]==2){
sum++;
break;
}
}
for(int i=x+1;i<10;i++){
if(a[i][y]==1)
break;
if(a[i][y]==2){
sum++;
break;
}
}
for(int j=y-1;j>=0;j--){
if(a[x][j]==1)
break;
if(a[x][j]==2){
sum++;
break;
}
}
for(int j=y+1;j<9;j++){
if(a[x][j]==1)
break;
if(a[x][j]==2){
sum++;
break;
}
}
if(sum==n)
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}