湖南省第八届大学生计算机程序设计竞赛(A,B,C,E,F,I,J)
A 三家人
Description
Input
输入第一行为数据组数T (T<=20)。每组数据仅一行,包含三个整数x, y, z (1<=x, y<=10,1<=z<=1000)。
Output
对于每组数据,输出一个整数,即A 太太应得的金额(单位:元)。
Sample Input
2
5 4 90
8 4 123
Sample Output
60
123
A太太和B太太工作的天数总除以三为每位太太应该工作的天数,减去这个数是帮助C太太工作的天数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int t;
double w,n,m;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf",&n,&m,&w);
double k=(m+n)/1.0;
double a=n-(k/3.0);
double b=m-(k/3.0);
if(a<=) printf("0\n");
else if(b<=) printf("%.lf\n",w);
else printf("%.lf\n",w*a/(a+b));
}
return ;
}
B 机器人的指令
Description
数轴原点有一个机器人。该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置。
·LEFT:往左移动一个单位
·RIGHT: 往右移动一个单位
·SAME AS i: 和第i 条执行相同的动作。输入保证i 是一个正整数,且不超过之前执行指令数
Input
输入第一行为数据组数T (T<=100)。每组数据第一行为整数n (1<=n<=100),即指令条数。以下每行一条指令。指令按照输入顺序编号为1~n。
Output
对于每组数据,输出机器人的最终位置。每处理完一组数据,机器人应复位到数轴原点。
Sample Input
2
3
LEFT
RIGHT
SAME AS 2
5
LEFT
SAME AS 1
SAME AS 2
SAME AS 1
SAME AS 4
Sample Output
1
-5
水题
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int a[],t,n,k;
char ch[],cch[];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int pos=;
for(int i=;i<=n;i++)
{
scanf("%s",ch);
if(ch[]=='L') a[i]=-,pos+=a[i];
else if(ch[]=='R') a[i]=,pos+=a[i];
else scanf("%s%d",cch,&k),a[i]=a[k],pos+=a[i];
}
printf("%d\n",pos);
}
return ;
}
C:Updating a Dictionary
Description
Input
Output
Sample Input
3
{a:3,b:4,c:10,f:6}
{a:3,c:5,d:10,ee:4}
{x:1,xyz:123456789123456789123456789}
{xyz:123456789123456789123456789,x:1}
{first:1,second:2,third:3}
{third:3,second:2}
Sample Output
+d,ee
-b,f
*c No changes -first
大模拟,注意输出规则,和键和值都为空时的判断情况
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
char a[];
set<string>s,sadd,smultiply;
set<string>::iterator it;
map<string,string>m;
int t,ok,flag;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s",&a);
int len=strlen(a);
string sa,sb;
int la=,lb=;
flag=;
for(int i=;i<len;i++)
{
if(a[i]==':') flag^=;
else if(a[i]==',' || a[i]=='}')
{
if(la || lb) m[sa]=sb,s.insert(sa),sa="",sb="",flag^=;
la=;lb=;
}
else if(flag)
{
if(a[i]!='+') sb+=a[i],lb++;
}
else sa+=a[i],la++;
}
scanf("%s",&a);
len=strlen(a);
flag=;
for(int i=;i<len;i++)
{
if(a[i]==':') flag^=;
else if(a[i]==',' || a[i]=='}')
{
flag^=;
if(la || lb)
{
if(s.count(sa)==) sadd.insert(sa);
else
{
if(m[sa]!=sb) smultiply.insert(sa);
s.erase(sa);
}
}
sa="";sb="";la=;lb=;
}
else if(flag)
{
if(a[i]!='+') sb+=a[i],lb++;
}
else sa+=a[i],la++;
}
if(sadd.size()== && smultiply.size()== && s.size()==) printf("No changes\n\n");
else
{
if(sadd.size()>)
{
ok=;
for(it=sadd.begin();it!=sadd.end();it++)
{
printf("%c",ok==?',':'+');
cout<<*it;ok=;
}
printf("\n");
}
if(s.size()>)
{
ok=;
for(it=s.begin();it!=s.end();it++)
{
printf("%c",ok==?',':'-');
cout<<*it;ok=;
}
printf("\n");
}
if(smultiply.size()>)
{
ok=;
for(it=smultiply.begin();it!=smultiply.end();it++)
{
printf("%c",ok==?',':'*');
cout<<*it;ok=;
}
printf("\n");
}
printf("\n");
}
s.clear();
sadd.clear();
smultiply.clear();
m.clear();
}
return ;
}
/*
4
{X:+123,VYVG:NNNJ}
{X:123,VYVG:NNNJ}
{:123,bgb:456,k:789}
{:124,bgb:123,k:789}
{:123,bgb:456,k:789}
{:123,bgb:452}
{:,xx:xx}
{xx:xx}
*/
/* No changes *,bgb -k
*bgb No changes */
E:最短的名字
Description
Input
Output
对于每组数据,输出所有人名字的字母总数。
Sample Input
1
3
aaaaa
bbb
abababab
Sample Output
5
简单字典树判断
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
char a[][];
int t,n;
struct trie
{
int cnt;
int len;
struct trie *next[];
trie()
{
cnt=;
len=;
for(int i=;i<;i++)
next[i]=NULL;
}
};
trie *root;
void insert(trie *root,char *s)
{
int len=strlen(s);
trie *p=root,*tmp;
for(int i=;i<len;i++)
{
if(p->next[s[i]-'a']==NULL)
{
tmp=new trie();
p->next[s[i]-'a']=tmp;
}
p=p->next[s[i]-'a'];
p->len=i+;
p->cnt++;
}
}
int find(trie *root,char *s)
{
int len=strlen(s);
trie *p=root;
for(int i=;i<len;i++)
{
if(p->next[s[i]-'a']==NULL) return ;
p=p->next[s[i]-'a'];
if(p->cnt==) return p->len;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
root=new trie();
scanf("%d",&n);
int ans=;
for(int i=;i<n;i++)
{
scanf("%s",&a[i]);
insert(root,a[i]);
}
for(int i=;i<n;i++)
ans+=find(root,a[i]);
printf("%d\n",ans);
}
return ;
}
F:Kingdoms
Description
Input
Output
For each test case, print the maximal accessible population.
Sample Input
2
4 6 6
500 400 300 200
1 2 4
1 3 3
1 4 2
4 3 5
2 4 6
3 2 7
4 6 5
500 400 300 200
1 2 4
1 3 3
1 4 2
4 3 5
2 4 6
3 2 7
Sample Output
1100
1000
要点是必须包含首都即城市1,然后不超过k,人口又尽可能多,刚开始以为是背包,搞不来,一看数据量很小2^15,枚举最小生成树就可以了,这里枚举的是标记路径
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int g[][],n,m,k;
int vis[],dis[];
int pos[],por[],ans,cont;
int x,y,z,t;
void init()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=i;j++)
{
g[i][j]=g[j][i]=(i==j?:INF);
}
}
}
int dij()
{
for(int i=;i<=n;i++)
{
dis[i]=g[][i];
vis[i]=;
}
vis[]=;
int v,maxn,inf=;
for(int i=;i<=n;i++)
{
maxn=INF;
for(int j=;j<=n;j++)
{
if(!vis[j] && pos[j] && maxn>dis[j])
{
maxn=dis[j];
v=j;
}
}
if(maxn==INF) break;
vis[v]=;
inf+=maxn;
for(int j=;j<=n;j++)
{
if(!vis[j] && pos[j]) dis[j]=min(g[v][j],dis[j]);
}
}
for(int i=;i<=n;i++)
{
if(vis[i]!=pos[i]) return INF;
}
return inf;
}
void dfs(int cnt)
{
if(cnt>n)
{
if(dij()<=k)
{
cont=;
for(int i=;i<=n;i++)
{
if(pos[i]) cont+=por[i];
}
ans=max(ans,cont);
}
return ;
}
for(int i=;i<=;i++)
{
pos[cnt]=i;
dfs(cnt+);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
init();
for(int i=;i<=n;i++)
scanf("%d",&por[i]);
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
g[x][y]=g[y][x]=min(g[x][y],z);
}
ans=por[];
pos[]=true;
dfs();
printf("%d\n",ans);
}
return ;
}
I:Collecting Coins
Description
Input
Output
For each test case, print the maximal number of coins you can collect.
Sample Input
3
3 4
S.OC
..O.
.XCX
4 6
S.X.CC
..XOCC
...O.C
....XC
4 4
.SXC
OO.C
..XX
.CCC
Sample Output
1
6
3
英语差的弱点一下就暴露了,那么多的细节一开始没反应过来,题看了好久才懂什么意思,收集金币,收集过后此地为空,开始坐标走过后为空,中间可能碰到障碍
或者岩石,但岩石可以移动,且每块岩石最多被移动一次,且只能往前进的方向移动,典型的搜索类题型,但有岩石不好搜索,可以先深搜一遍,然后再从岩石处搜索
因为开始的搜索已被标记,不用担心重复,之后两者之和即为解。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int dir[][]={{,},{,-},{,},{-,}};
int t,n,m,ans,pos,k,cnt,inf;
int vis[][],cont;
char a[][];
struct Node
{
int x;
int y;
int mark;
Node(int a,int b,int c):x(a),y(b),mark(c){}
Node(){}
}node[];
int check(int x,int y)
{
if(x< || x>=n || y< || y>=m) return ;
return ;
}
void dfs(int x,int y,int flag)
{
vis[x][y]=flag;
for(int i=;i<;i++)
{
int nx=x+dir[i][];
int ny=y+dir[i][];
if(!check(nx,ny) || a[nx][ny]=='X' || vis[nx][ny] || a[nx][ny]=='O') continue;
if(a[nx][ny]=='C') cnt++;
dfs(nx,ny,flag);
}
}
void backtrack(int x,int y,int flag)
{
vis[x][y]=;
for(int i=;i<;i++)
{
int nx=x+dir[i][];
int ny=y+dir[i][];
if(!check(nx,ny) || vis[nx][ny]!=flag) continue;
backtrack(nx,ny,flag);
}
}
void solve(int x)
{
if(x>=k || pos+inf==ans) return;
for(int i=;i<k && pos+inf<ans;i++)
{
if(node[i].mark) continue;
node[i].mark=;
for(int j=;j<;j++)
{
int nx=node[i].x+dir[j][],ny=node[i].y+dir[j][];
if(!check(nx,ny) || a[nx][ny]=='X' || !vis[nx][ny]) continue;//是否可以站人
nx=node[i].x-dir[j][],ny=node[i].y-dir[j][];//朝面对的那个方向推
if(!check(nx,ny) || a[nx][ny]!='.') continue;
a[nx][ny]='X',a[node[i].x][node[i].y]='.';
cnt=;
dfs(node[i].x,node[i].y,i+);
cont+=cnt;
int t=cnt;
solve(x+);
inf=max(cont,inf);
backtrack(node[i].x,node[i].y,i+);
cont-=t;
a[nx][ny]='.',a[node[i].x][node[i].y]='O';
}
node[i].mark=;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
int ax,by;
scanf("%d%d",&n,&m);
k=;ans=;pos=;
for(int i=;i<n;i++)
{
scanf("%s",&a[i]);
for(int j=;j<m;j++)
{
if(a[i][j]=='S') ax=i,by=j,a[i][j]='.';
else if(a[i][j]=='O') node[k++]=Node(i,j,);
else if(a[i][j]=='C') ans++;
}
}
memset(vis,,sizeof(vis));
cnt=;inf=,cont=;
dfs(ax,by,);
pos=cnt;
solve();
pos+=inf;
printf("%d\n",pos);
}
return ;
}
J:病毒
Description
Input
Output
对于每组数据,输出真实事件序列的最长可能长度。
Sample Input
1
9 1 4 2 6 3 8 5 9 1
6 2 7 6 3 5 1
Sample Output
3 刚开始只是简单的以为两次最长子序列然后去最小就可以了,无限wa,最后才发现这样顺序不能保证,所以是最长上升公共子序列,dp一下就可以了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int a[],b[],dp[];
int n,m,t,ans;
int solve()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<m;i++)
scanf("%d",&b[i]);
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)
{
ans=;
for(int j=;j<m;j++)
{
if(a[i]>b[j]) ans=max(ans,dp[j]);
if(a[i]==b[j]) dp[j]=ans+;
}
}
ans=;
for(int i=;i<m;i++)
{
ans=max(ans,dp[i]);
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--)
{
printf("%d\n",solve());
}
return ;
}
湖南省第八届大学生计算机程序设计竞赛(A,B,C,E,F,I,J)的更多相关文章
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- 2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解
2019年湖南省大学生计算机程序设计竞赛 (HNCPC2019) 简要题解 update10.01 突然发现叉姐把这场的题传到牛客上了,现在大家可以有地方提交了呢. 不知道该干什么所以就来水一篇题解 ...
- 湖南省第十三届大学生计算机程序设计竞赛 Football Training Camp 贪心
2007: Football Training Camp[原创-转载请说明] Submit Page Summary Time Limit: 1 Sec Memory Limit: 1 ...
- 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛 B - 大还是小? 字符串水题
B - 大还是小? Time Limit:5000MS Memory Limit:65535KB 64bit IO Format: Description 输入两个实数,判断第一个数大 ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛Problem A 2016 找规律归类
Problem A: 2016 Time Limit: 5 Sec Memory Limit: 128 MB Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) ...
- 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路
1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...
- 湖南省第十二届大学生计算机程序设计竞赛 B 有向无环图 拓扑DP
1804: 有向无环图 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 187 Solved: 80[Submit][Status][Web Board ...
- 湖南省第十二届大学生计算机程序设计竞赛 G Parenthesis
1809: Parenthesis Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q ...
- 湖南省第十二届大学生计算机程序设计竞赛 A 2016
1803: 2016 Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. In ...
随机推荐
- ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)
前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...
- HTTP状态码:300\400\500 错误代码
一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 ...
- parted---磁盘分区
parted命令是由GNU组织开发的一款功能强大的磁盘分区和分区大小调整工具,与fdisk不同,它支持调整分区的大小.作为一种设计用于Linux的工具,它没有构建成处理与fdisk关联的多种分区类型, ...
- Android后台进程与前台线程间的区别使用
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 很早就翻译过Android API的一篇文章Android高级 ...
- vmware启动虚拟机报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine is stored is almost full. To continue, free an additional 1.4 GB of disk space.
报错VMware Workstation has paused this virtual machine because the disk on which the virtual machine i ...
- CCNP路由实验之六 动态路由协议之IS-IS
CCNP路由实验之六动态路由协议之IS-IS 动态路由协议能够自己主动的发现远程网络.仅仅要网络拓扑结构发生了变化.路由器就会相互交换路由信息,不仅能够自己主动获知新添加的网络.还能够在当前网络 ...
- 特定位取反(js实现)
去华为面试的时候.没有做好准备工作.面试的流程没有问清也没有查,结果一过去就让上机做题,着实有点措手不及.笔者是擅长前端的Java Webproject师啊,主要的底层编程知识早已生疏了.机试题碰到了 ...
- Canny边缘检测及C++实现
Canny边缘检测算法是澳大利亚科学家John F. Canny在1986年提出来的,不得不提一下的是当年John Canny本人才28岁!到今天已经30年过去了,Canny算法仍然是图像边缘检测算法 ...
- Gym - 100625F Count Ways 快速幂+容斥原理
题意:n*m的格子,中间有若干点不能走,问从左上角到右下角有多少种走法. 思路:CountWay(i,j) 表示从 i 点到 j 点的种数.然后用容斥原理加加减减解决 #pragma comment( ...
- eclipse启动Tomcat加载项目时报内存溢出错误解决办法
在eclipse中点击Window->Preferences打开全局属性设置对话框,如下图所示设置Tomcat运行时的JVM参数,添加这段JVM设置:-Xms256M -Xmx768M -XX: ...