password 123

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/A

题意:给国王生日可能区间【a,b】,死亡日期可能区间【c,d】,a《=b < c《=d,问国王可能最短寿命和最长寿命。

解法:min=c-b max=d-a

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e5+;
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int a,b,c,d;
while(~scanf("%d%d%d%d",&a,&b,&c,&d),a|b|c|d){
printf("%d %d\n",c-b,d-a);
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/B

题意:给16种颜色的rgb值,输入一个rgb,输出最接近的颜色,距离是欧几里得距离,多个距离相等输出靠前的。

解法:暴力测试。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e5+;
char str[][]={"White","Silver","Gray","Black","Red","Maroon","Yellow","Olive","Lime","Green","Aqua","Teal","Blue","Navy","Fuchsia","Purple"};
int R[]={,,,,,,,,,,,,,,,};
int G[]={,,,,,,,,,,,,,,,};
int B[]={,,,,,,,,,,,,,,,};
int r,g,b;
int Square(int x){
return x*x;
}
int Distance2(int R,int G,int B){
return Square(R-r)+Square(G-g)+Square(B-b);
}
int solve(){
int id=;
int d=Distance2(R[],G[],B[]);
for(int i=;i<;i++){
int td=Distance2(R[i],G[i],B[i]);
if(d>td){
d=td;
id=i;
}
}
return id;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(~scanf("%d%d%d",&r,&g,&b),~r){
puts(str[solve()]);
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/C

题意:输入T个队伍,P个问题,S次提交,问哪段时间内同时满足4个条件,1每个队都过题,2没有队全过ak,3每个题都有人过,4没有题被所有人过。保证这种时间段只有一个。

解法:按照提交时间排序,然后暴力测试。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=5e3+;
int T,P,S,start_id,end_id;
struct Submission{
int teamID,hour,minute,second,total;
char problemID[];
bool result;
friend bool operator <(const Submission &a,const Submission &b){
return a.total<b.total;
}
void init(){
total=hour*+minute*+second;
}
}submission[M];
bool accepted[][];
void get_result(int id){
char c;
submission[id].result=false;
while(true){
c=getchar();
if(c=='\n') return ;
if(c=='Y') submission[id].result=true;
}
}
void init(){
start_id=-;
end_id=-;
for(int i=;i<S;i++){
submission[i].init();
}
for(int i=;i<=T;i++){
for(int j=;j<P;j++){
accepted[i][j]=false;
}
}
}
bool solved_at_least_one(int teamID){
for(int i=;i<P;i++){
if(accepted[teamID][i]) return true;
}
return false;
}
bool solved_all(int teamID){
for(int i=;i<P;i++){
if(!accepted[teamID][i]) return false;
}
return true;
}
bool at_least_one_team(int problemID){
for(int i=;i<=T;i++){
if(accepted[i][problemID]) return true;
}
return false;
}
bool solved_by_all(int problemID){
for(int i=;i<=T;i++){
if(!accepted[i][problemID]) return false;
}
return true;
}
bool judge(){
for(int i=;i<=T;i++){
if(solved_at_least_one(i)) continue;
return false;
}
for(int i=;i<=T;i++){
if(solved_all(i)) return false;
}
for(int i=;i<P;i++){
if(at_least_one_team(i)) continue;
return false;
}
for(int i=;i<P;i++){
if(solved_by_all(i)) return false;
}
return true;
}
void solve(){
init();
sort(submission,submission+S);
for(int i=;i<S;i++){
if(submission[i].result){
accepted[submission[i].teamID][submission[i].problemID[]-'A']=true;
}
if(judge()){
if(start_id==-) start_id=i;
end_id=i;
}
else{
if(start_id!=-) return ;
}
}
}
void out(int id){
if(id<||id>S-){
printf("--:--:--");
return ;
}
printf("%02d:%02d:%02d",submission[id].hour,submission[id].minute,submission[id].second);
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(~scanf("%d%d%d",&T,&P,&S),T|P|S){
for(int i=;i<S;i++){
scanf("%d%s%d:%d:%d",&submission[i].teamID,submission[i].problemID,&submission[i].hour,&submission[i].minute,&submission[i].second);
get_result(i);
}
solve();
out(start_id);
putchar(' ');
if(end_id!=-) end_id++;
out(end_id);
putchar('\n');
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/D

题意:输入n个电梯,输入每个电梯停m楼,输入m个楼的层号,从i楼到j楼花费时间是两者的距离。求从起点到终点最短时间。

解法:同一个电梯的任意两层楼建双向边,距离为绝对值,单元最短路。

spfa

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=2e2+;
int W[M][M];
int n,s,t;
struct Elevator {
int m;
int floor[M];
} elevator[];
class Spfa { ///最短路快速算法O(E*k)(k~=2)
typedef int typec;///边权的类型
static const int ME=4e4+;///边的个数
static const int MV=2e2+;///点的个数
struct E {
int v,next;
typec w;
} e[ME];
int n,le,head[MV],inque[MV],pre[MV],i,u,v;
typec dist[MV];
bool used[MV];
queue<int> q;
public:
void init(int tn) { ///传入点的个数
n=tn;
le=;
for(i=; i<=n; i++) head[i]=-;
}
void add(int u,int v,typec w) {
e[le].v=v;
e[le].w=w;
e[le].next=head[u];
head[u]=le++;
}
bool solve(int s) { ///传入起点,存在负环返回false
for(i=; i<=n; i++) {
dist[i]=inf;
used[i]=true;
inque[i]=;
pre[i]=-;
}
used[s]=false;
dist[s]=;
inque[s]++;
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty()) {
u=q.front();
q.pop();
used[u]=true;
for(i=head[u]; ~i; i=e[i].next) {
v=e[i].v;
if(dist[v]>dist[u]+e[i].w) {
dist[v]=dist[u]+e[i].w;
pre[v]=u;
if(!used[v]) continue;
used[v]=false;
q.push(v);
inque[v]++;
if(inque[v]>n) return false;
}
}
}
return true;
}
typec getdist(int id) {
return dist[id];
}
int getpre(int id) {
return pre[id];
}
} spfa;
void add(int u,int v,int w) {
if(W[u][v]>w) {
W[u][v]=w;
W[v][u]=w;
}
}
void init() {
mt(W,0x3f);
for(int i=; i<n; i++) {
int m=elevator[i].m;
for(int j=; j<m; j++) {
for(int k=j+; k<m; k++) {
int u=elevator[i].floor[j];
int v=elevator[i].floor[k];
int w=abs(u-v);
add(u,v,w);
}
}
}
}
int solve() {
init();
spfa.init();
for(int i=;i<;i++){
for(int j=;j<;j++){
if(W[i][j]==inf) continue;
spfa.add(i,j,W[i][j]);
}
}
spfa.solve(s);
return spfa.getdist(t);
}
int main() {
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(~scanf("%d%d%d",&n,&s,&t),n|s|t) {
for(int i=; i<n; i++) {
scanf("%d",&elevator[i].m);
for(int j=; j<elevator[i].m; j++) {
scanf("%d",&elevator[i].floor[j]);
}
}
printf("%d\n",solve());
}
return ;
}

priority——queue dij

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=2e2+;
int W[M][M];
int n,s,t;
struct Elevator {
int m;
int floor[M];
} elevator[];
class Dijkstra { ///Dijkstra 堆优化O(E*log(V))
typedef int typec;///边权的类型
static const int ME=4e4+;///边的个数
static const int MV=2e2+;///点的个数
struct Q {
int id;
typec w;
friend bool operator <(const Q &a,const Q &b) {
return a.w>b.w;
}
} now;
priority_queue<Q> q;
struct E {
int v,next;
typec w;
} e[ME];
int n,le,head[MV],pre[MV],u,v,i;
typec dist[MV],w;
bool used[MV];
public:
void init(int tn) {///传入点的个数
n=tn;
le=;
for(i=; i<=n; i++) head[i]=-;
}
void add(int u,int v,typec w) {
e[le].v=v;
e[le].w=w;
e[le].next=head[u];
head[u]=le++;
}
void solve(int s) {///传入起点
for(i=; i<=n; i++) {
used[i]=true;
dist[i]=inf;
pre[i]=-;
}
dist[s]=;
now.id=s;
now.w=;
while(!q.empty()) q.pop();
q.push(now);
while(!q.empty()) {
now=q.top();
q.pop();
u=now.id;
if(!used[u]) continue;
used[u]=false;
for(i=head[u]; ~i; i=e[i].next) {
v=e[i].v;
w=e[i].w;
if(used[v]&&dist[v]>w+dist[u]) {
dist[v]=w+dist[u];
pre[v]=u;
now.id=v;
now.w=dist[v];
q.push(now);
}
}
}
}
typec getdist(int id) {
return dist[id];
}
int getpre(int id) {
return pre[id];
}
} spfa;
void add(int u,int v,int w) {
if(W[u][v]>w) {
W[u][v]=w;
W[v][u]=w;
}
}
void init() {
mt(W,0x3f);
for(int i=; i<n; i++) {
int m=elevator[i].m;
for(int j=; j<m; j++) {
for(int k=j+; k<m; k++) {
int u=elevator[i].floor[j];
int v=elevator[i].floor[k];
int w=abs(u-v);
add(u,v,w);
}
}
}
}
int solve() {
init();
spfa.init();
for(int i=; i<; i++) {
for(int j=; j<; j++) {
if(W[i][j]==inf) continue;
spfa.add(i,j,W[i][j]);
}
}
spfa.solve(s);
return spfa.getdist(t);
}
int main() {
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(~scanf("%d%d%d",&n,&s,&t),n|s|t) {
for(int i=; i<n; i++) {
scanf("%d",&elevator[i].m);
for(int j=; j<elevator[i].m; j++) {
scanf("%d",&elevator[i].floor[j]);
}
}
printf("%d\n",solve());
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/F

题意:输入一些时间,有正有负,最后输出他们的和。

解法:把字符串的整数处理出来累加。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
char a[M];
int solve(){
int sign=;
if(a[]=='-') sign=-;
int i;
int hour=;
for(i=;a[i];i++){
if(!isdigit(a[i])) break;
hour*=;
hour+=a[i]-'';
}
int minute=;
i++;
for(;a[i];i++){
minute*=;
minute+=a[i]-'';
}
return (hour*+minute)*sign;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int sum=;
while(~scanf("%s",a)){
if(a[]=='$'||a[]=='#'){
printf("%d:%02d\n",sum/,sum%);
sum=;
continue;
}
sum+=solve();
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97960#problem/G

题意:n个城市,m条无向边,k条龙,给出图,和龙所在城市c,初始脑袋的个数s,每分钟增加的脑袋数n。每个勇士每分钟可以砍一个龙头或者走到一个相邻的城市。可以决定勇士一开始的位置。问最少几个勇士可以杀死所有的龙。

解法:如果龙的每分钟增加n小于勇士的总数,那总有一天能杀完这些龙,如果n》=勇士的总数,那必须在第一天将s全砍了。最后答案是每个连通块需要的勇士相加,对每个连通块可以二分勇士数量,验证时判断n》=总数的龙的s求和是否小于等于mid。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e3+;
struct E{
int u,v;
}e[M*M];
struct Dragon{
int c,s,n;
}dragon[M];
vector<int> g[M],dragon_id;
bool vis[M];
int n,m,k;
void add(int u,int v){
g[u].push_back(v);
g[v].push_back(u);
}
void init(){
for(int i=;i<=n;i++){
g[i].clear();
vis[i]=false;
}
for(int i=;i<m;i++){
add(e[i].u,e[i].v);
}
}
bool judge(int mid){
int len=dragon_id.size();
int sum=;
for(int i=;i<len;i++){
if(dragon[dragon_id[i]].n<mid) continue;
sum+=dragon[dragon_id[i]].s;
}
return sum<=mid;
}
int get_cost(){
int len=dragon_id.size();
int L=,R=;
for(int i=;i<len;i++){
R=max(R,dragon[dragon_id[i]].n+);
}
int result=R;
while(L<=R){
int mid=(L+R)>>;
if(judge(mid)){
result=mid;
R=mid-;
}
else{
L=mid+;
}
}
return result;
}
void dfs(int u){
vis[u]=true;
for(int i=;i<k;i++){
if(dragon[i].c==u) dragon_id.push_back(i);
}
int len=g[u].size();
for(int i=;i<len;i++){
int v=g[u][i];
if(vis[v]) continue;
dfs(v);
}
}
int solve(){
init();
int result=;
for(int i=;i<=n;i++){
if(vis[i]) continue;
dragon_id.clear();
dfs(i);
result+=get_cost();
}
return result;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(~scanf("%d%d%d",&n,&m,&k),n|m|k){
for(int i=;i<m;i++){
scanf("%d%d",&e[i].u,&e[i].v);
}
for(int i=;i<k;i++){
scanf("%d%d%d",&dragon[i].c,&dragon[i].s,&dragon[i].n);
}
printf("%d\n",solve());
}
return ;
}

end

matrix_last_acm_5的更多相关文章

随机推荐

  1. [译]MongoDb生产环境注意事项

    译注: 本文是翻译MongoDB Manuel中的MongoDB Production Notes一节内容.这节内容重点关注生产环境中影响性能和可靠性的各种注意事项,值得正在部署MongoDB的工作者 ...

  2. php文件上传的例子

    1.上传表单 upload.html 程序代码 [html] view plaincopy <form enctype="multipart/form-data" actio ...

  3. 一个自定义的C#数据库操作基础类 SqlHelper

    SqlHelper其实是我们自己编写的一个类,使用这个类目的就是让使用者更方便.更安全的对数据库的操作,既是除了在SqlHelper类以外的所有类将不用引用对数据库操作的任何类与语句,无须担心数据库的 ...

  4. Server Tomcat v7.0 Server at localhost failed to start解决办法

    今晚搞了下tomcat,在调试的时候发现报了这样一个错误Server Tomcat v7.0 Server at localhost failed to start 首先,确认了端口号8080是不是被 ...

  5. 如何解决android studio 运行时中文乱码的问题

    相信很多朋友都会遇到android studio 在MAC OS中运行的时候中文乱码.而在代码编辑的时候正常.经过几天的不断寻找解决办法,终于解决了 比如: Toast.makeText(MainAc ...

  6. SequoiaDB版本升级及导入导出工具说明

    升级SequoiaDB数据库指导 SequoiaDB安装路径:SDB_HOME=/opt/sequoiadb 数据存储路径:DATABASE=/ opt/sequoiadb/database 一.导出 ...

  7. zip解压缩

    package com.green.project.compress; import java.io.File;import java.io.FileInputStream;import java.i ...

  8. JQUERY 判断选择器选择的对象 是否存在

    判断方法: 直接选择判断,是不正确的方法,因为 $(“#id”) 不管对象是否存在都会返回 object . if($("#id")){ alert('存在'); }else{ a ...

  9. [原创]从Oracle和Microsoft Sql Server迁移到PostgreSQL Plus Advanced Server

    一.了解PPAS的迁移方式1.在线迁移和离线迁移使用Migration Studio或Migration Toolkit直接向PPAS数据库进行对象定义和数据表中数据的迁移称为在线迁移,生成要迁移对象 ...

  10. 黑客群体的露面说明互联网公司开始回馈IT行业了,

    揭开中国黑客群体的神秘面纱 年薪数百万 2015-04-26 09:59:45 15259 次阅读 14 次推荐 稿源:经济观察报 33 条评论   在网络世界有专属的代号,那里才是他们最习惯的“世界 ...