• matrix_last_acm_5


    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

     1 //#define debug
     2 //#define txtout
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<cmath>
     7 #include<cctype>
     8 #include<ctime>
     9 #include<iostream>
    10 #include<algorithm>
    11 #include<vector>
    12 #include<queue>
    13 #include<stack>
    14 #include<map>
    15 #include<set>
    16 #define mt(a,b) memset(a,b,sizeof(a))
    17 using namespace std;
    18 typedef long long LL;
    19 const double eps=1e-8;
    20 const double pi=acos(-1.0);
    21 const int inf=0x3f3f3f3f;
    22 const int M=1e5+10;
    23 int main(){
    24     #ifdef txtout
    25     freopen("in.txt","r",stdin);
    26     freopen("out.txt","w",stdout);
    27     #endif
    28     int a,b,c,d;
    29     while(~scanf("%d%d%d%d",&a,&b,&c,&d),a|b|c|d){
    30         printf("%d %d
    ",c-b,d-a);
    31     }
    32     return 0;
    33 }
    View Code

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

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

    解法:暴力测试。

     1 //#define debug
     2 //#define txtout
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<cmath>
     7 #include<cctype>
     8 #include<ctime>
     9 #include<iostream>
    10 #include<algorithm>
    11 #include<vector>
    12 #include<queue>
    13 #include<stack>
    14 #include<map>
    15 #include<set>
    16 #define mt(a,b) memset(a,b,sizeof(a))
    17 using namespace std;
    18 typedef long long LL;
    19 const double eps=1e-8;
    20 const double pi=acos(-1.0);
    21 const int inf=0x3f3f3f3f;
    22 const int M=1e5+10;
    23 char str[32][16]={"White","Silver","Gray","Black","Red","Maroon","Yellow","Olive","Lime","Green","Aqua","Teal","Blue","Navy","Fuchsia","Purple"};
    24 int R[32]={255,192,128,0,255,128,255,128,0,0,0,0,0,0,255,128};
    25 int G[32]={255,192,128,0,0,0,255,128,255,128,255,128,0,0,0,0};
    26 int B[32]={255,192,128,0,0,0,0,0,0,0,255,128,255,128,255,128};
    27 int r,g,b;
    28 int Square(int x){
    29     return x*x;
    30 }
    31 int Distance2(int R,int G,int B){
    32     return Square(R-r)+Square(G-g)+Square(B-b);
    33 }
    34 int solve(){
    35     int id=0;
    36     int d=Distance2(R[0],G[0],B[0]);
    37     for(int i=1;i<16;i++){
    38         int td=Distance2(R[i],G[i],B[i]);
    39         if(d>td){
    40             d=td;
    41             id=i;
    42         }
    43     }
    44     return id;
    45 }
    46 int main(){
    47     #ifdef txtout
    48     freopen("in.txt","r",stdin);
    49     freopen("out.txt","w",stdout);
    50     #endif
    51     while(~scanf("%d%d%d",&r,&g,&b),~r){
    52         puts(str[solve()]);
    53     }
    54     return 0;
    55 }
    View Code

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

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

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

      1 //#define debug
      2 //#define txtout
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<cctype>
      8 #include<ctime>
      9 #include<iostream>
     10 #include<algorithm>
     11 #include<vector>
     12 #include<queue>
     13 #include<stack>
     14 #include<map>
     15 #include<set>
     16 #define mt(a,b) memset(a,b,sizeof(a))
     17 using namespace std;
     18 typedef long long LL;
     19 const double eps=1e-8;
     20 const double pi=acos(-1.0);
     21 const int inf=0x3f3f3f3f;
     22 const int M=5e3+10;
     23 int T,P,S,start_id,end_id;
     24 struct Submission{
     25     int teamID,hour,minute,second,total;
     26     char problemID[4];
     27     bool result;
     28     friend bool operator <(const Submission &a,const Submission &b){
     29         return a.total<b.total;
     30     }
     31     void init(){
     32         total=hour*3600+minute*60+second;
     33     }
     34 }submission[M];
     35 bool accepted[160][32];
     36 void get_result(int id){
     37     char c;
     38     submission[id].result=false;
     39     while(true){
     40         c=getchar();
     41         if(c=='
    ') return ;
     42         if(c=='Y') submission[id].result=true;
     43     }
     44 }
     45 void init(){
     46     start_id=-1;
     47     end_id=-1;
     48     for(int i=0;i<S;i++){
     49         submission[i].init();
     50     }
     51     for(int i=1;i<=T;i++){
     52         for(int j=0;j<P;j++){
     53             accepted[i][j]=false;
     54         }
     55     }
     56 }
     57 bool solved_at_least_one(int teamID){
     58     for(int i=0;i<P;i++){
     59         if(accepted[teamID][i]) return true;
     60     }
     61     return false;
     62 }
     63 bool solved_all(int teamID){
     64     for(int i=0;i<P;i++){
     65         if(!accepted[teamID][i]) return false;
     66     }
     67     return true;
     68 }
     69 bool at_least_one_team(int problemID){
     70     for(int i=1;i<=T;i++){
     71         if(accepted[i][problemID]) return true;
     72     }
     73     return false;
     74 }
     75 bool solved_by_all(int problemID){
     76     for(int i=1;i<=T;i++){
     77         if(!accepted[i][problemID]) return false;
     78     }
     79     return true;
     80 }
     81 bool judge(){
     82     for(int i=1;i<=T;i++){
     83         if(solved_at_least_one(i)) continue;
     84         return false;
     85     }
     86     for(int i=1;i<=T;i++){
     87         if(solved_all(i)) return false;
     88     }
     89     for(int i=0;i<P;i++){
     90         if(at_least_one_team(i)) continue;
     91         return false;
     92     }
     93     for(int i=0;i<P;i++){
     94         if(solved_by_all(i)) return false;
     95     }
     96     return true;
     97 }
     98 void solve(){
     99     init();
    100     sort(submission,submission+S);
    101     for(int i=0;i<S;i++){
    102         if(submission[i].result){
    103             accepted[submission[i].teamID][submission[i].problemID[0]-'A']=true;
    104         }
    105         if(judge()){
    106             if(start_id==-1) start_id=i;
    107             end_id=i;
    108         }
    109         else{
    110             if(start_id!=-1) return ;
    111         }
    112     }
    113 }
    114 void out(int id){
    115     if(id<0||id>S-1){
    116         printf("--:--:--");
    117         return ;
    118     }
    119     printf("%02d:%02d:%02d",submission[id].hour,submission[id].minute,submission[id].second);
    120 }
    121 int main(){
    122     #ifdef txtout
    123     freopen("in.txt","r",stdin);
    124     freopen("out.txt","w",stdout);
    125     #endif
    126     while(~scanf("%d%d%d",&T,&P,&S),T|P|S){
    127         for(int i=0;i<S;i++){
    128             scanf("%d%s%d:%d:%d",&submission[i].teamID,submission[i].problemID,&submission[i].hour,&submission[i].minute,&submission[i].second);
    129             get_result(i);
    130         }
    131         solve();
    132         out(start_id);
    133         putchar(' ');
    134         if(end_id!=-1) end_id++;
    135         out(end_id);
    136         putchar('
    ');
    137     }
    138     return 0;
    139 }
    View Code

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

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

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

     spfa

      1 //#define debug
      2 //#define txtout
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<cctype>
      8 #include<ctime>
      9 #include<iostream>
     10 #include<algorithm>
     11 #include<vector>
     12 #include<queue>
     13 #include<stack>
     14 #include<map>
     15 #include<set>
     16 #define mt(a,b) memset(a,b,sizeof(a))
     17 using namespace std;
     18 typedef long long LL;
     19 const double eps=1e-8;
     20 const double pi=acos(-1.0);
     21 const int inf=0x3f3f3f3f;
     22 const int M=2e2+10;
     23 int W[M][M];
     24 int n,s,t;
     25 struct Elevator {
     26     int m;
     27     int floor[M];
     28 } elevator[16];
     29 class Spfa { ///最短路快速算法O(E*k)(k~=2)
     30     typedef int typec;///边权的类型
     31     static const int ME=4e4+10;///边的个数
     32     static const int MV=2e2+10;///点的个数
     33     struct E {
     34         int v,next;
     35         typec w;
     36     } e[ME];
     37     int n,le,head[MV],inque[MV],pre[MV],i,u,v;
     38     typec dist[MV];
     39     bool used[MV];
     40     queue<int> q;
     41 public:
     42     void init(int tn) { ///传入点的个数
     43         n=tn;
     44         le=0;
     45         for(i=0; i<=n; i++) head[i]=-1;
     46     }
     47     void add(int u,int v,typec w) {
     48         e[le].v=v;
     49         e[le].w=w;
     50         e[le].next=head[u];
     51         head[u]=le++;
     52     }
     53     bool solve(int s) { ///传入起点,存在负环返回false
     54         for(i=0; i<=n; i++) {
     55             dist[i]=inf;
     56             used[i]=true;
     57             inque[i]=0;
     58             pre[i]=-1;
     59         }
     60         used[s]=false;
     61         dist[s]=0;
     62         inque[s]++;
     63         while(!q.empty()) q.pop();
     64         q.push(s);
     65         while(!q.empty()) {
     66             u=q.front();
     67             q.pop();
     68             used[u]=true;
     69             for(i=head[u]; ~i; i=e[i].next) {
     70                 v=e[i].v;
     71                 if(dist[v]>dist[u]+e[i].w) {
     72                     dist[v]=dist[u]+e[i].w;
     73                     pre[v]=u;
     74                     if(!used[v]) continue;
     75                     used[v]=false;
     76                     q.push(v);
     77                     inque[v]++;
     78                     if(inque[v]>n) return false;
     79                 }
     80             }
     81         }
     82         return true;
     83     }
     84     typec getdist(int id) {
     85         return dist[id];
     86     }
     87     int getpre(int id) {
     88         return pre[id];
     89     }
     90 } spfa;
     91 void add(int u,int v,int w) {
     92     if(W[u][v]>w) {
     93         W[u][v]=w;
     94         W[v][u]=w;
     95     }
     96 }
     97 void init() {
     98     mt(W,0x3f);
     99     for(int i=0; i<n; i++) {
    100         int m=elevator[i].m;
    101         for(int j=0; j<m; j++) {
    102             for(int k=j+1; k<m; k++) {
    103                 int u=elevator[i].floor[j];
    104                 int v=elevator[i].floor[k];
    105                 int w=abs(u-v);
    106                 add(u,v,w);
    107             }
    108         }
    109     }
    110 }
    111 int solve() {
    112     init();
    113     spfa.init(150);
    114     for(int i=0;i<150;i++){
    115         for(int j=0;j<150;j++){
    116             if(W[i][j]==inf) continue;
    117             spfa.add(i,j,W[i][j]);
    118         }
    119     }
    120     spfa.solve(s);
    121     return spfa.getdist(t);
    122 }
    123 int main() {
    124 #ifdef txtout
    125     freopen("in.txt","r",stdin);
    126     freopen("out.txt","w",stdout);
    127 #endif
    128     while(~scanf("%d%d%d",&n,&s,&t),n|s|t) {
    129         for(int i=0; i<n; i++) {
    130             scanf("%d",&elevator[i].m);
    131             for(int j=0; j<elevator[i].m; j++) {
    132                 scanf("%d",&elevator[i].floor[j]);
    133             }
    134         }
    135         printf("%d
    ",solve());
    136     }
    137     return 0;
    138 }
    View Code

     priority——queue dij

      1 //#define debug
      2 //#define txtout
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<cctype>
      8 #include<ctime>
      9 #include<iostream>
     10 #include<algorithm>
     11 #include<vector>
     12 #include<queue>
     13 #include<stack>
     14 #include<map>
     15 #include<set>
     16 #define mt(a,b) memset(a,b,sizeof(a))
     17 using namespace std;
     18 typedef long long LL;
     19 const double eps=1e-8;
     20 const double pi=acos(-1.0);
     21 const int inf=0x3f3f3f3f;
     22 const int M=2e2+10;
     23 int W[M][M];
     24 int n,s,t;
     25 struct Elevator {
     26     int m;
     27     int floor[M];
     28 } elevator[16];
     29 class Dijkstra { ///Dijkstra 堆优化O(E*log(V))
     30     typedef int typec;///边权的类型
     31     static const int ME=4e4+10;///边的个数
     32     static const int MV=2e2+10;///点的个数
     33     struct Q {
     34         int id;
     35         typec w;
     36         friend bool operator <(const Q &a,const Q &b) {
     37             return a.w>b.w;
     38         }
     39     } now;
     40     priority_queue<Q> q;
     41     struct E {
     42         int v,next;
     43         typec w;
     44     } e[ME];
     45     int n,le,head[MV],pre[MV],u,v,i;
     46     typec dist[MV],w;
     47     bool used[MV];
     48 public:
     49     void init(int tn) {///传入点的个数
     50         n=tn;
     51         le=0;
     52         for(i=0; i<=n; i++) head[i]=-1;
     53     }
     54     void add(int u,int v,typec w) {
     55         e[le].v=v;
     56         e[le].w=w;
     57         e[le].next=head[u];
     58         head[u]=le++;
     59     }
     60     void solve(int s) {///传入起点
     61         for(i=0; i<=n; i++) {
     62             used[i]=true;
     63             dist[i]=inf;
     64             pre[i]=-1;
     65         }
     66         dist[s]=0;
     67         now.id=s;
     68         now.w=0;
     69         while(!q.empty()) q.pop();
     70         q.push(now);
     71         while(!q.empty()) {
     72             now=q.top();
     73             q.pop();
     74             u=now.id;
     75             if(!used[u]) continue;
     76             used[u]=false;
     77             for(i=head[u]; ~i; i=e[i].next) {
     78                 v=e[i].v;
     79                 w=e[i].w;
     80                 if(used[v]&&dist[v]>w+dist[u]) {
     81                     dist[v]=w+dist[u];
     82                     pre[v]=u;
     83                     now.id=v;
     84                     now.w=dist[v];
     85                     q.push(now);
     86                 }
     87             }
     88         }
     89     }
     90     typec getdist(int id) {
     91         return dist[id];
     92     }
     93     int getpre(int id) {
     94         return pre[id];
     95     }
     96 } spfa;
     97 void add(int u,int v,int w) {
     98     if(W[u][v]>w) {
     99         W[u][v]=w;
    100         W[v][u]=w;
    101     }
    102 }
    103 void init() {
    104     mt(W,0x3f);
    105     for(int i=0; i<n; i++) {
    106         int m=elevator[i].m;
    107         for(int j=0; j<m; j++) {
    108             for(int k=j+1; k<m; k++) {
    109                 int u=elevator[i].floor[j];
    110                 int v=elevator[i].floor[k];
    111                 int w=abs(u-v);
    112                 add(u,v,w);
    113             }
    114         }
    115     }
    116 }
    117 int solve() {
    118     init();
    119     spfa.init(150);
    120     for(int i=0; i<150; i++) {
    121         for(int j=0; j<150; j++) {
    122             if(W[i][j]==inf) continue;
    123             spfa.add(i,j,W[i][j]);
    124         }
    125     }
    126     spfa.solve(s);
    127     return spfa.getdist(t);
    128 }
    129 int main() {
    130 #ifdef txtout
    131     freopen("in.txt","r",stdin);
    132     freopen("out.txt","w",stdout);
    133 #endif
    134     while(~scanf("%d%d%d",&n,&s,&t),n|s|t) {
    135         for(int i=0; i<n; i++) {
    136             scanf("%d",&elevator[i].m);
    137             for(int j=0; j<elevator[i].m; j++) {
    138                 scanf("%d",&elevator[i].floor[j]);
    139             }
    140         }
    141         printf("%d
    ",solve());
    142     }
    143     return 0;
    144 }
    View Code

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

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

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

     1 //#define debug
     2 //#define txtout
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<cmath>
     7 #include<cctype>
     8 #include<ctime>
     9 #include<iostream>
    10 #include<algorithm>
    11 #include<vector>
    12 #include<queue>
    13 #include<stack>
    14 #include<map>
    15 #include<set>
    16 #define mt(a,b) memset(a,b,sizeof(a))
    17 using namespace std;
    18 typedef long long LL;
    19 const double eps=1e-8;
    20 const double pi=acos(-1.0);
    21 const int inf=0x3f3f3f3f;
    22 const int M=1e2+10;
    23 char a[M];
    24 int solve(){
    25     int sign=1;
    26     if(a[0]=='-') sign=-1;
    27     int i;
    28     int hour=0;
    29     for(i=1;a[i];i++){
    30         if(!isdigit(a[i])) break;
    31         hour*=10;
    32         hour+=a[i]-'0';
    33     }
    34     int minute=0;
    35     i++;
    36     for(;a[i];i++){
    37         minute*=10;
    38         minute+=a[i]-'0';
    39     }
    40     return (hour*60+minute)*sign;
    41 }
    42 int main(){
    43     #ifdef txtout
    44     freopen("in.txt","r",stdin);
    45     freopen("out.txt","w",stdout);
    46     #endif
    47     int sum=0;
    48     while(~scanf("%s",a)){
    49         if(a[0]=='$'||a[0]=='#'){
    50             printf("%d:%02d
    ",sum/60,sum%60);
    51             sum=0;
    52             continue;
    53         }
    54         sum+=solve();
    55     }
    56     return 0;
    57 }
    View Code

    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。

      1 //#define debug
      2 //#define txtout
      3 #include<cstdio>
      4 #include<cstdlib>
      5 #include<cstring>
      6 #include<cmath>
      7 #include<cctype>
      8 #include<ctime>
      9 #include<iostream>
     10 #include<algorithm>
     11 #include<vector>
     12 #include<queue>
     13 #include<stack>
     14 #include<map>
     15 #include<set>
     16 #define mt(a,b) memset(a,b,sizeof(a))
     17 using namespace std;
     18 typedef long long LL;
     19 const double eps=1e-8;
     20 const double pi=acos(-1.0);
     21 const int inf=0x3f3f3f3f;
     22 const int M=1e3+10;
     23 struct E{
     24     int u,v;
     25 }e[M*M];
     26 struct Dragon{
     27     int c,s,n;
     28 }dragon[M];
     29 vector<int> g[M],dragon_id;
     30 bool vis[M];
     31 int n,m,k;
     32 void add(int u,int v){
     33     g[u].push_back(v);
     34     g[v].push_back(u);
     35 }
     36 void init(){
     37     for(int i=1;i<=n;i++){
     38         g[i].clear();
     39         vis[i]=false;
     40     }
     41     for(int i=0;i<m;i++){
     42         add(e[i].u,e[i].v);
     43     }
     44 }
     45 bool judge(int mid){
     46     int len=dragon_id.size();
     47     int sum=0;
     48     for(int i=0;i<len;i++){
     49         if(dragon[dragon_id[i]].n<mid) continue;
     50         sum+=dragon[dragon_id[i]].s;
     51     }
     52     return sum<=mid;
     53 }
     54 int get_cost(){
     55     int len=dragon_id.size();
     56     int L=1,R=0;
     57     for(int i=0;i<len;i++){
     58         R=max(R,dragon[dragon_id[i]].n+1);
     59     }
     60     int result=R;
     61     while(L<=R){
     62         int mid=(L+R)>>1;
     63         if(judge(mid)){
     64             result=mid;
     65             R=mid-1;
     66         }
     67         else{
     68             L=mid+1;
     69         }
     70     }
     71     return result;
     72 }
     73 void dfs(int u){
     74     vis[u]=true;
     75     for(int i=0;i<k;i++){
     76         if(dragon[i].c==u) dragon_id.push_back(i);
     77     }
     78     int len=g[u].size();
     79     for(int i=0;i<len;i++){
     80         int v=g[u][i];
     81         if(vis[v]) continue;
     82         dfs(v);
     83     }
     84 }
     85 int solve(){
     86     init();
     87     int result=0;
     88     for(int i=1;i<=n;i++){
     89         if(vis[i]) continue;
     90         dragon_id.clear();
     91         dfs(i);
     92         result+=get_cost();
     93     }
     94     return result;
     95 }
     96 int main(){
     97     #ifdef txtout
     98     freopen("in.txt","r",stdin);
     99     freopen("out.txt","w",stdout);
    100     #endif
    101     while(~scanf("%d%d%d",&n,&m,&k),n|m|k){
    102         for(int i=0;i<m;i++){
    103             scanf("%d%d",&e[i].u,&e[i].v);
    104         }
    105         for(int i=0;i<k;i++){
    106             scanf("%d%d%d",&dragon[i].c,&dragon[i].s,&dragon[i].n);
    107         }
    108         printf("%d
    ",solve());
    109     }
    110     return 0;
    111 }
    View Code

    end

  • 相关阅读:
    【解决】Ubuntu命令行弹出光驱的方法
    【8086汇编基础】02寻址方式和MOV指令
    【8086汇编基础】03变量、数组和常量的处理
    Ubuntu12.10 内核源码外编译 linux模块编译驱动模块的基本方法
    【8086汇编基础】05常用函数库文件emu8086.inc
    Ubuntu12.10 使用DNW传数据 进行ARM开发板烧写
    【8086汇编基础】04中断
    【8086汇编基础】01汇编语言简要介绍
    飞凌OK6410开发板移植uboot官方最新版uboot2012.10.tar.bz2
    【8086汇编基础】00基础知识各种进制的数据
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/4933185.html
Copyright © 2020-2023  润新知