化学很神奇,以下是烷烃基。
假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基
你的任务是甄别烷烃基的类别。
原子没有编号方法,比如
1 2
2 3
3 4
4 5
5 6
和
1 3
2 3
2 4
4 5
5 6
是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了。
Input
输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b)
数据保证,输入的烷烃基是以上5种之一
Output
每组数据,输出一行,代表烷烃基的英文名
思想
观察发现每个点的度数大致不同,分别是
{1,1,1,2,2,3};{1,1,2,2,2,2}; {1,1,1,1,2,4}; {1,1,1,1,3,3};
除了methylpentane外,其他三个均不同,而2-methylpentane和3-methylpentane度数分布均为{1,1,1,2,2,3}。
所以只需要将每个点的度数求出来与度数数组对比,若为后三个则直接输出即可,若为第一个则需要进一步判断。
观察2-methylpentane和3-methylpentane发现2-m度数为3的点跟着两个度数为1的点,而3-m度数为3的点跟着两个度数为2的点。所以只需要找出度数为三的点关联的两个点的度数即可。
以下为全部代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; bool pd(int a[],int b[]){ for(int i=0;i<=5;i++){ if(a[i]!=b[i+1]) return false; } return true; } int main(){ int a[6] = {1,1,1,2,2,3}; int b[6] = {1,1,2,2,2,2}; int c[6] = {1,1,1,1,2,4}; int e[6] = {1,1,1,1,3,3}; int z; cin>>z; while(z){ z--; int d[7] = {0,0,0,0,0,0,0}; pair<int,int> con[10]; int ta,tb; for(int i=0;i<=4;i++){ cin>>ta>>tb; d[ta]+=1; d[tb]+=1; con[2*i] = pair<int,int>(ta,tb); con[2*i+1] = pair<int,int>(tb,ta); } int q[7]; for(int i=0;i<7;i++){ q[i]=d[i]; } sort(d+1,d+7); if(pd(a,d)){ int tmp=0; int t[3]; int j = 0; for(int i=1;i<=6;i++){ if(q[i]==3){ tmp=i; break; } } for(int i=0;i<10;i++){ if(con[i].first==tmp){ t[j] = con[i].second; j++; } } if(q[t[0]]+q[t[1]]+q[t[2]]==4){ cout<<"2-methylpentane"<<endl; } else{ cout<<"3-methylpentane"<<endl; } } if(pd(b,d)){ cout<<"n-hexane"<<endl; } if(pd(c,d)){ cout<<"2,2-dimethylbutane"<<endl; } if(pd(e,d)){ cout<<"2,3-dimethylbutane"<<endl; } } return 0; }
程序设计思维作业和实验使用的实时评测系统,具有及时获得成绩排名的特点,那它的功能是怎么实现的呢?
我们千辛万苦怼完了不忍直视的程序并提交以后,评测系统要么返回AC,要么是返回各种其他的错误,不论是怎样的错法,它总会给你记上一笔,表明你曾经在这儿被坑过,而当你历经千辛终将它AC之后,它便会和你算笔总账,表明这题共错误提交了几次。
在岁月的长河中,你通过的题数虽然越来越多,但通过每题时你所共花去的时间(从最开始算起,直至通过题目时的这段时间)都会被记录下来,作为你曾经奋斗的痕迹。特别的,对于你通过的题目,你曾经的关于这题的每次错误提交都会被算上一定的单位时间罚时,这样一来,你在做出的题数上,可能领先别人很多,但是在做出同样题数的人中,你可能会因为罚时过高而处于排名上的劣势。
例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。例子可见下方的样例输入与输出部分。
Input
Output
根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。
Sample Input
8 20 GuGuDong 96 -3 40(3) 0 0 1 -8 0 hrz 107 67 -3 0 0 82 0 0 TT 120(3) 30 10(1) -3 0 47 21(2) -2 OMRailgun 0 -99 -8 0 -666 -10086 0 -9999996 yjq -2 37(2) 13 -1 0 113(2) 79(1) -1 Zjm 0 0 57(5) 0 0 99(3) -7 0
Sample Output
TT 5 348 yjq 4 342 GuGuDong 3 197 hrz 3 256 Zjm 2 316 OMRailgun 0 0
思想
问题的关键在于数据的读取,匹配负号和括号即可。
采用结构体对每个学生进行存储,并利用堆存储,并重定义比较规则。
typedef struct tx{ string name; int success; int lostime; }tx; struct cmp{ bool operator()(tx &a,tx &c){ if(a.success!=c.success) return (a.success)<(c.success)?true:false; else if(a.lostime!=c.lostime) return a.lostime>c.lostime?true:false; else return a.name>c.name?true:false; } };
通过依次读取字符串,若没遇到‘(’则检测有无‘-’,若无,则+耗时,若有则ac-1,若遇到‘(’,则+耗时+单位罚时*括号内错误提交数。
以下为全部代码
#include <iostream> #include <stdio.h> #include <algorithm> #include <string> #include <queue> #include <cmath> using namespace std; typedef struct tx{ string name; int success; int lostime; }tx; struct cmp{ bool operator()(tx &a,tx &c){ if(a.success!=c.success) return (a.success)<(c.success)?true:false; else if(a.lostime!=c.lostime) return a.lostime>c.lostime?true:false; else return a.name>c.name?true:false; } }; using namespace std; int main(){ int m,n; // freopen("test.txt","r",stdin); cin>>m>>n; string tmp; priority_queue<tx,vector<tx>,cmp> heap; tx t; while(cin>>tmp){ t.name=tmp; t.lostime = 0; t.success = m; for(int i=0;i<m;i++){ cin>>tmp; if(tmp.find(‘(‘)==-1){ if(tmp!="0"&&tmp.find(‘-‘)==-1){ int s = tmp.size(); for(int j=0;j<s;j++){ t.lostime+=(int(tmp[j])-48)*pow(10,s-j-1); } } else{ t.success-=1; } } else{ int s = tmp.find(‘(‘); for(int j=0;j<s;j++){ t.lostime+=(int(tmp[j])-48)*pow(10,s-j-1); } int st = tmp.find(‘)‘); for(int j=s+1;j<st;j++){ t.lostime+=(int(tmp[j])-48)*pow(10,st-j-1)*n; } } } heap.push(t); } tx mm; while(heap.size()){ mm = heap.top(); printf("%-10s %2d %4d\n",mm.name.c_str(),mm.success,mm.lostime); heap.pop(); } return 0; }
瑞神HRZ因为疫情在家闲得无聊,同时他又非常厉害,所有的课对他来说都是水一水就能拿A+,所以他无聊,找来了另外三个人:咕咕东,腾神以及zjm来打牌(天下苦瑞神久矣)。
显然,牌局由四个人构成,围成一圈。我们称四个方向为北 东 南
西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2
< 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q
< K < A。
现在你作为上帝,你要从小到大排序每个人手中的牌,并按照给定格式输出。(具体格式见输出描述和样例输出)。
Input
Output
输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South
Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
Sample Input
N CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9 SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3 #
Sample Output
South player: +---+---+---+---+---+---+---+---+---+---+---+---+---+ |6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T| | C | C | D | D | S | S | S | S | H | H | H | H | H | |6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T| +---+---+---+---+---+---+---+---+---+---+---+---+---+ West player: +---+---+---+---+---+---+---+---+---+---+---+---+---+ |2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A| | C | C | C | C | D | D | D | S | S | S | S | H | H | |2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A| +---+---+---+---+---+---+---+---+---+---+---+---+---+ North player: +---+---+---+---+---+---+---+---+---+---+---+---+---+ |3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3| | C | C | C | D | D | D | D | D | S | S | S | H | H | |3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3| +---+---+---+---+---+---+---+---+---+---+---+---+---+ East player: +---+---+---+---+---+---+---+---+---+---+---+---+---+ |7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K| | C | C | C | C | D | D | D | S | S | H | H | H | H | |7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K| +---+---+---+---+---+---+---+---+---+---+---+---+---+
思想
定义poke结构体,利用堆并重定义比较规则。
typedef struct poke{ char num; char hua; int tn; int th; poke(){} void set(char n,char m){ this->num = n; this->hua = m; this->tn = ap[n]; this->th = bp[m]; } }poke; string out[4]={"North player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","East player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n", "South player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","West player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n"}; struct cmp{ bool operator()(poke tca,poke tcb){ if(tca.th!=tcb.th) return tca.th<tcb.th; else return tca.tn<tcb.tn; } };
将输入存储到四个堆当中,然后按照相对顺序,找到south位置,进行输出即可。
错误:在提交时先是一直PE,自以为改完bug后又出现RE。RE是由于数组取余时用负数取余了,PE则是由于每次输出没有输出空格,最后输出时多了一行空格。
全部代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <queue> #include <cmath> #include <map> using namespace std; map<char,int> ap; map<char,int> bp; char a[13] = {‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘T‘,‘J‘,‘Q‘,‘K‘,‘A‘}; char b[4] = {‘C‘,‘D‘,‘S‘,‘H‘}; typedef struct poke{ char num; char hua; int tn; int th; poke(){} void set(char n,char m){ this->num = n; this->hua = m; this->tn = ap[n]; this->th = bp[m]; } }poke; string out[4]={"North player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","East player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n", "South player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","West player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n"}; struct cmp{ bool operator()(poke tca,poke tcb){ if(tca.th!=tcb.th) return tca.th<tcb.th; else return tca.tn<tcb.tn; } }; using namespace std; int main(){ // freopen("test.txt","r",stdin); // freopen("out.txt","w",stdout); for(int i=0;i<=12;i++){ ap[a[i]] = i; } for(int i=0;i<=3;i++){ bp[b[i]] = i; } priority_queue<poke,vector<poke>,cmp> q[4]; poke cp[52]; char cd; cin>>cd; while(cd!=‘#‘){ int ouc = 0; if(cd==‘N‘) ouc = 0; else if(cd==‘E‘) ouc = 1; else if(cd==‘S‘) ouc = 2; else ouc = 3; char ta,tb; for(int i=0;i<=51;i++){ cin>>ta>>tb; cp[i].set(tb,ta); q[i%4].push(cp[i]); } cin>>cd; char thua[13]; char tnum[13]; for(int j=0;j<=3;j++){ for(int i=0;i<13;i++){ int zb = (j+(1-ouc)+4)%4; tnum[i] = q[zb].top().num; thua[i] = q[zb].top().hua; q[zb].pop(); } cout<<out[(2+j)%4]; for(int i=0;i<13;i++){ cout<<"|"<<tnum[12-i]<<" "<<tnum[12-i]; } cout<<"|"<<endl; for(int i=0;i<13;i++){ cout<<"| "<<thua[12-i]<<" "; } cout<<"|"<<endl; for(int i=0;i<13;i++){ cout<<"|"<<tnum[12-i]<<" "<<tnum[12-i]; } cout<<"|"<<endl; if(cd!=‘#‘||j<3) cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; else cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"; } if(cd!=‘#‘) cout<<endl; } return 0; }
原文:https://www.cnblogs.com/mopa/p/12391295.html