• 三道小小模拟


    A-化学 烷烃基类别甄别

    题意:

    给定随机编号代表原子编号,

    输入5行表示两两编号之间存在化学键

    然后输出烷烃基种类

    我的笨思路:

    根据输入信息很容易得到每个原子分别参与多少个化学键的组成,

    根剧化学键的组成情况可区分出除 "3-methylpentane"和"2-methylpentane"之外的烷烃基

    但是由于编号的无序性,剩下的两种按照这种思路难以解决下去,其实这种刻画不能体现其本质的特征

    经过思考,可以发现其化学键的内在逻辑是固定的,然不想重写。。

    剩下的含三个键的与其相邻的原子们的化学键组成是不一样的!

    前面的思路代码已经成形,后期只得在前面思路的基础上做了修补,勉强解决了本题。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int jian(int k,int s[][2]){
    	int sum=0;
    	for(int i=0;i<5;i++){
    		if(k==s[i][0]||k==s[i][1])
    		sum++;
    	};
    	return sum;//计算编号为K的原子的化学键数
    }
    int main(){
    	int n;cin>>n;
    	while(n--){
    		int s[5][2];
    		int *num=new int[6];
    		for(int i=0;i<6;i++) num[i]=0;
    		for(int i=0;i<5;i++)
    		{
    		cin>>s[i][0]>>s[i][1];
    	    num[s[i][0]-1]++;
    	    num[s[i][1]-1]++;
    		}
    
    		int index=0;
    		for(int i=0;i<6;i++)
    		if(num[i]==3)
    		index=i;
    		
    		sort(num,num+6);//按照化学键数排序
    		if(num[5]==4)
    		cout<<"2,2-dimethylbutane"<<endl;
    		else if(num[5]==2)
    		cout<<"n-hexane"<<endl;
    		else if(num[5]==3){
    			if(num[4]==3)
    			    cout<<"2,3-dimethylbutane"<<endl;
    			else {
    				int sum=0;
    				for(int i=0;i<5;i++)
    				{     //计算出与含三个化学键相邻的原子的化学键总数
    					if(s[i][0]==index+1)
    						sum+=jian(s[i][1],s);
    					else if(s[i][1]==index+1)
    					    sum+=jian(s[i][0],s);
    				}
    				if(sum==4)//2+1+1
    				cout<<"2-methylpentane"<<endl;
    				else if(sum==5)//2+2+1
    				cout<<"3-methylpentane"<<endl;
    			}
    		}
    		
    	}
    return 0; }

    反思:

    遇到问题不能稍微有一点思路就瞎写,  还是要多多思考,尤其这种模拟题,要抓住数据的内在联系的本质。

    如在本题中,键的位置关系是决定了烷烃基的本质。

    B-考试排名

    Input

    输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式,见上面的表格。

    Output

    根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。

    题目涉及的数据类型
    	/*标记  负数   提交次数         not AC
    	        正数   AC耗时             AC
    	        a(b)   耗时(错误次数)   AC 
    		      !!!其中time在AC的里面算 
    	*/      

    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

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    #include<iomanip>
    using namespace std;
    const int  max=100010; 
    
    typedef struct inf{
    	   string name;  
    	   int ac;      
    	   int time;    //罚时 
    	   //string grade[n];	
    }inf;
    bool cmp(inf t1,inf t2){
    	if(t1.ac!=t2.ac)
    	    return t1.ac>t2.ac;//ac数降序
        if(t1.time!=t2.time)
        	return t1.time<t2.time;//时间升序
        return t1.name<t2.name;//姓名字典序升序
    }    
    int main(){
    	int n,m;
    	cin>>n>>m;
    题目涉及的数据类型 /*标记 负数 提交次数 not AC 正数 AC耗时 AC a(b) 耗时(错误次数) AC !!!其中time在AC的里面算 */ //inf *mes=new inf[max]; inf mes[100010]; //memset(mes,0,sizeof(inf)); int j=0; //输入并处理 //while(scanf("%s", &(mes[j].name[0]))!=EOF){ while(cin>>mes[j].name){ int nopass=0,thetime=0; for(int i=0;i<n;i++) { string str; //scanf("%s",&str[0]); cin>>str;
    //判断字符串类型 if(str[0]=='-'||str[0]=='0') nopass++;//以‘-’或者‘0’开头的表示没有ac else if(str[str.length()-1]==')')//判断是否是括号? { mes[j].time +=atoi(str.c_str());//自动把( 前面的转化为整型的时间 int t; for(t=0;t<str.length();t++){ if(str[t]=='(') break; } t++;//找到( 把括号内的错误提交计算出来 int wrong=0; while(str[t]!=')'){ wrong*=10; wrong+= str[t]-'0'; t++; } mes[j].time+=wrong*m; //加权重计算罚时 } else { //一次ac耗时 直接计算罚时即可 mes[j].time += atoi(str.c_str()) ; } } mes[j].ac=n-nopass;//总题数目-未通过的数目 //cout<<mes[j].name<<endl; j++; } //排序 sort(mes,mes+j,cmp); for(int i=0;i<j;i++){ cout<<setw(10)<<setiosflags(ios::left)<<mes[i].name<<" "<<setw(2)<<setiosflags(ios::right)<<mes[i].ac<<" "<<setw(4)<<setiosflags(ios::right)<<mes[i].time<<endl; cout.setf(ios::left,ios::right);//每次要把默认右对齐改为左对齐!!ps.这种格式练得少要注意总结。。。 } return 0; }

      okkkkkk

    C-模拟打牌

    题意: 

                                  North

                    West                     East

                                  South

    52张牌,指定发牌员,从下一个人开始顺时针发牌,对每个玩家手中的牌进行排序并输出

    这道模拟题看起来比较麻烦,不妨慢慢看怎么一步一步处理

    1.数据的表示:

    【牌】对于每一张牌,我们既要大小,又要花色,很直观的就想到用结构体或者二维数组来表示,

    由于 后面涉及到排序,我们把它当做一个不可分割的单位,用结构体就比较好(可能数组也行。。不太会,行列指针可以应该)!

    处理好牌的表示问题,我们很自然地就可以把每个人手中的牌用结构体数组来存储表示了

    2.数据输入:

    我们先不妨不要管是谁发牌的,先把牌发下去分好类,存进不同的结构体内。

    3.数据处理(排序

    排序先按照花色排序,再按照大小排序(小技巧)

    由于花色  c <d <s< h 这样的指标不好衡量,所以  我们可以偷偷地先把他们替换为升序的其他字符,,或者1 2 3 4 排序后还原即可

    我还写了一堆if  else。。。。太复杂了。。emmmm     写完看了下,我的代码居然还是if else..懒得改了哎

    同样的对于“大小”,大于9的我们也做替换,便于排序,排序完成后在还原成原来的就好了。。(我是到了这里才回头的)

    4.输出

    对玩家的输出顺序是固定的,那么我们现在可以根据输入的发牌的人判断存储的对应关系,依次输出

    可以找规律输出,但是就四种情况,最后实在思考不动了索性if else裸输出了。。

    Input:

    输入包含多组数据
    每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
    接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。

    Output

    输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
    每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

    Sample Input and Output 

    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|
    +---+---+---+---+---+---+---+---+---+---+---+---+---+
     
    View Code

     AC Code

      1 #include<iostream>
      2 #include<string>
      3 #include<algorithm>
      4 using namespace std;
      5 #include<map>
      6 //char dir[4]={'N','E','S','W'};
      7 //花色:  C梅花<D方片<S黑桃<H红桃 
      8 //大小:  2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A
      9 //map<char,int> no={{}}
     10 //{{"C",1},{"D",2},{"S",3},{"H",4} };
     11 
     12 //T  a;  J b;Q c;K d;A e
     13 typedef struct card{
     14      char color;
     15      char num;     
     16 }card;
     17 bool cmp(card  c1,card c2){
     18     if(c1.color=='C'){
     19         if(c2.color=='C'){
     20              //判断数码大小 
     21              return c1.num<c2.num;
     22         }
     23         else
     24            return true;
     25     }else if(c1.color=='D'){
     26           
     27           if(c2.color=='C')
     28               return false;
     29           else if(c2.color=='D'){
     30                //判断数码大小
     31                 return c1.num<c2.num;
     32           }          
     33           else 
     34               return true; 
     35     }
     36     else if(c1.color=='S')  {
     37            if(c2.color=='H')
     38            return true;
     39            else if(c2.color=='S')
     40            //判断大小
     41             return c1.num<c2.num;
     42            else 
     43                return false; 
     44     }
     45     else { if(c2.color=='H')
     46            //判断数码大小
     47             return c1.num<c2.num;
     48            else 
     49              return false;         
     50     } 
     51      
     52 }
     53 void print(card per[][13]){
     54     for(int i=0;i<4;i++)
     55     {
     56     for(int j=0;j<13;j++)
     57        cout<<per[i][j].color<<per[i][j].num<<" ";
     58     cout<<endl;
     59     }
     60 }  /*
     61 |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|
     62 | C | C | D | D | S | S | S | S | H | H | H | H | H |
     63 |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|
     64 +---+---+---+---+---+---+---+---+---+---+---+---+---+
     65 */
     66 void print_each(card per[][13],int row){
     67      //first line
     68      cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
     69      //second line
     70      for(int i=0;i<13;i++){
     71          cout<<"|"<<per[row][i].num<<" "<<per[row][i].num;
     72      }
     73      cout<<"|"<<endl;
     74      
     75      //third line
     76      for(int i=0;i<13;i++){
     77          cout<<"| "<<per[row][i].color<<" ";
     78      }
     79      cout<<"|"<<endl;
     80      
     81      //fourth line
     82      for(int i=0;i<13;i++){
     83          cout<<"|"<<per[row][i].num<<" "<<per[row][i].num;
     84      }
     85      cout<<"|"<<endl;
     86      
     87      //fifth line
     88      cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
     89      
     90 }
     91 int main(){
     92     
     93     //string s1,s2,s3,s4,s5;cin>>s1>>s2>>s3>>s4>>s5; 
     94     
     95     char offer;    
     96     cin>>offer;
     97     string str,str1;   
     98     //string per[4];      
     99     card per[4][13];    
    100     while(offer!='#')
    101     {
    102     cin>>str>>str1;    
    103     str.append(str1);
    104     //两个字母一组
    105     //string color;
    106     //string num;    
    107     for(int i=0,j=0;i<str.length();i+=2,j++){
    108          per[j%4][j/4].color = str[i];
    109          per[j%4][j/4].num   = str[i+1];
    110          //if(j&&j%4==0)
    111          //    k++;     
    112          if(per[j%4][j/4].num=='T')         //转换后便于比较 
    113          per[j%4][j/4].num='a';
    114          else if(per[j%4][j/4].num=='J')
    115          per[j%4][j/4].num='b';
    116          else if(per[j%4][j/4].num=='Q')
    117          per[j%4][j/4].num='c';
    118          else if(per[j%4][j/4].num=='K')
    119          per[j%4][j/4].num='d';
    120          else if(per[j%4][j/4].num=='A') 
    121          per[j%4][j/4].num='e';
    122     }    
    123     //print(per);
    124     for(int i=0;i<4;i++){   //排序 
    125         sort(per[i],per[i]+13,cmp);
    126         for(int j=0;j<13;j++){      //变换回去 
    127             if(per[i][j].num=='a')
    128             per[i][j].num='T';
    129             if(per[i][j].num=='b')
    130             per[i][j].num='J';
    131             if(per[i][j].num=='c')
    132             per[i][j].num='Q';
    133             if(per[i][j].num=='d')
    134             per[i][j].num='K';
    135             if(per[i][j].num=='e')
    136             per[i][j].num='A';
    137         }
    138     }    
    139        //NESW
    140        //offer->next==per[0]    
    141        if(offer=='N'){
    142            cout<<"South player:"<<endl;
    143            print_each(per,1);
    144            cout<<"West player:"<<endl;
    145            print_each(per,2);
    146         cout<<"North player:"<<endl;
    147            print_each(per,3);
    148            cout<<"East player:"<<endl;
    149            print_each(per,0);    
    150        }        
    151        else if(offer=='E') {
    152         cout<<"South player:"<<endl;
    153            print_each(per,0);
    154            cout<<"West player:"<<endl;
    155            print_each(per,1);
    156         cout<<"North player:"<<endl;
    157            print_each(per,2);
    158            cout<<"East player:"<<endl;
    159            print_each(per,3);    
    160        }
    161        
    162        else if(offer=='S'){
    163            cout<<"South player:"<<endl;
    164            print_each(per,3);
    165            cout<<"West player:"<<endl;
    166            print_each(per,0);
    167         cout<<"North player:"<<endl;
    168            print_each(per,1);
    169            cout<<"East player:"<<endl;
    170            print_each(per,2);    
    171        }
    172        
    173        else if(offer=='W'){
    174            cout<<"South player:"<<endl;
    175            print_each(per,2);
    176            cout<<"West player:"<<endl;
    177            print_each(per,3);
    178         cout<<"North player:"<<endl;
    179            print_each(per,0);
    180            cout<<"East player:"<<endl;
    181            print_each(per,1);    
    182        }
    183     cout<<endl;      
    184     cin>>offer;
    185     }
    186     //cout<<str<<endl;
    187     //print(per);
    188         
    189     return 0;
    190 }

    小小三道模拟,头疼 ,咳咳。。

    流转星云
  • 相关阅读:
    ZOJ
    Clock(数学题)
    The Lucky Week(规律)
    POJ 3233 Matrix Power Series
    POJ 1061 青蛙的约会(扩展欧几里德算法)
    2266: number
    2263: neighbor
    2269: minval(优先队列)
    HDU
    Problem 2150 Fire Game (广搜+枚举)
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12423300.html
Copyright © 2020-2023  润新知