2018年內蒙古自治區第十三屆大學生程式設計競賽題解
阿新 • • 發佈:2019-02-09
A.內蒙創業
簡單判斷是否符合條件即可
#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.涮羊肉
首先處理出所有肉變得美味的時刻,對它們從小到大排序,使用貪心策略,一旦可以撈肉就撈。這樣就可以使每次可以撈肉的起始時間儘量早。
#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.狙擊敵人
判斷斜率和方向即可
#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.醫療兵
動態規劃,有七種轉移:- 用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.逃離機場
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.洗衣服
模擬
#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.哥本哈根妖
反證法可以證明以