CCF-2题代码整合

//CCF201703-2学生排队(坐标转换)中间可以简化 
#include<iostream>
using namespace std;
//这种转换可以用一个结构体存储来避免,但输出就还要重新排序
int pos_stu[1001];//根据位置找学号 ,输出时期 
int stu_pos[1001];//根据学号找位置,操作时期 
int main(){
    int n,i,j,k,num,change;
    int direct;//变量 1/-1 
    cin>>n;
    for(i=1;i<=n;i++){
        pos_stu[i]=i;
        stu_pos[i]=i;
    } 
    cin>>k;
    for(i=0;i<k;i++){
        cin>>num>>change;
        direct=change>0?1:-1;
        //stu_pos[num]表示要换的学号所在位置
        if(change>0){
            for(j=stu_pos[num];j<stu_pos[num]+change;j++){
                pos_stu[j]=pos_stu[j+1];
                if(j!=stu_pos[num])
                    stu_pos[pos_stu[j]]--;
            }
            pos_stu[stu_pos[num]+change]=num;
            stu_pos[num]+=change;
            stu_pos[pos_stu[stu_pos[num]+change]]--;
        }else if(change<0){
            for(j=stu_pos[num];j>stu_pos[num]+change;j--){
                pos_stu[j]=pos_stu[j-1];
                if(j!=stu_pos[num])
                    stu_pos[pos_stu[j]]++;
            }
            pos_stu[stu_pos[num]+change]=num;
            stu_pos[num]+=change;
            stu_pos[pos_stu[stu_pos[num]+change]]++;
        }
    }
    for(i=1;i<=n;i++){
        cout<<pos_stu[i];
        if(i!=n){
            cout<<' ';
        }else{
            cout<<endl;
        }
    }
    return 0;
} 
 1 //CCF201612-2工资计算(分段函数) 
 2 #include<iostream>
 3 using namespace std;
 4 int range[8]={0,3500,3500+1500,3500+4500,3500+9000,3500+35000,3500+55000,3500+80000};//每个区间段的下界 
 5 float rate[8]={1,0.97,0.9,0.8,0.75,0.7,0.65,0.55};//每个阶段的税率 
 6 int rangey[8];//按工资的划分的下界 
 7 int main(){
 8     int n,i,ans;
 9     cin>>n;
10     rangey[0]=0;
11     for(i=1;i<=7;i++){
12         rangey[i]=rangey[i-1]+(range[i]-range[i-1])*rate[i-1];
13     }
14     for(i=7;i>=0;i--){
15         if(n>=rangey[i])
16             break;
17     } 
18     ans=range[i]+(n-rangey[i])/rate[i];
19     cout<<ans<<endl;
20     return 0;
21 }
 1 //CCF201609-2火车购票(一种尝试:vector<vector<int> > array(m)来构建列长动态的二维数组) //应该还可以用map做,主要思路都是暴力
 2 #include<iostream>
 3 #include<vector> 
 4 using namespace std;
 5 int main(){
 6     int n,i,j,num,m,k,flag;
 7     int index;
 8     cin>>n;
 9     vector<vector<int> > a(20);//模拟余票 
10     vector<vector<int> > b(100);//结果 
11     for(i=0;i<20;i++){
12         for(j=0;j<5;j++){
13             a[i].push_back((i+1)*5-j);
14         }
15     }
16     for(i=0;i<n;i++){
17         cin>>num;
18         flag=0;
19         for(j=0;j<20;j++){
20             if(num<=a[j].size()){
21                 for(k=0;k<num;k++){
22                     index=a[j].size()-1;
23                     //cout<<a[j][index]<<' ';
24                     b[i].push_back(a[j][index]);
25                     a[j].pop_back();
26                 }
27                 flag=1;
28                 break;
29             }
30         }
31         if(flag==0){//无法相邻 
32             for(j=0;j<20;j++){
33                 while(a[j].size()!=0){
34                     if(num==0)
35                         break;
36                     index=a[j].size()-1;
37                     //cout<<a[j][index]<<' ';
38                     b[i].push_back(a[j][index]);
39                     a[j].pop_back();
40                     num--;
41                 }
42                 if(num==0)
43                     break;
44             }
45         } 
46     }
47     for(i=0;i<n;i++){
48         for(j=0;j<b[i].size();j++){
49             cout<<b[i][j]<<' ';
50         }
51         cout<<"\b\n";
52     }
53     return 0;
54 }
 1 //CCF201604-2俄罗斯方块(模拟:下落过程用一个结构体数组(存储位置变动)来模拟) 
 2 #include<iostream>
 3 using namespace std;
 4 struct pos{
 5     int x;
 6     int y;
 7 };
 8 int a[15][10];
 9 int b[4][4];
10 pos map[16];//最多16个位置满,为b中有效点的位置 
11 int main(){
12     int i,j,ver,px,py,ans,min=4,k=0;
13     pos temp;
14     for(i=0;i<15;i++){
15         for(j=0;j<10;j++){
16             cin>>a[i][j];
17         }
18     } 
19     for(i=0;i<4;i++){
20         for(j=0;j<4;j++){
21             cin>>b[i][j];
22             if(b[i][j]){
23                 map[k].x=i;
24                 map[k].y=j;
25                 k++;
26                 if(j<min){
27                     min=j;
28                 }
29             }
30         }
31     }
32     cin>>ver;//map[k].y-min+ver为实际y 
33     for(i=0;i<15;i++){//最多下降15格 ,没有考虑放不下的情况 
34         for(j=0;j<k;j++){
35             px=map[j].x+i;
36             py=map[j].y-min+ver;
37             if(a[px][py]){
38                 ans=i-1;
39                 break;
40             }
41         }
42         if(ans){
43             break;
44         }
45     }
46     for(i=0;i<k;i++){
47         px=map[i].x+ans;
48         py=map[i].y-min+ver;
49         a[px][py]=1;
50     }
51     for(i=0;i<15;i++){
52         for(j=0;j<10;j++){
53             cout<<a[i][j]<<' ';
54         }
55         cout<<"\b\n";
56     }
57     return 0;
58 }
 1 //CCF201512-2消除类游戏(两个数组存储或者节省空间直接在原数组上通过变负做标记,因为颜色标号必为正数,理解题意很重要) 
 2 #include<iostream>
 3 using namespace std;
 4 int a[31][31];//感觉本题数量不大,直接用两个数组挺好 
 5 int f(int x){//绝对值
 6     return x>0?x:-x; 
 7 }
 8 int main(){
 9     int n,m,i,j;
10     cin>>n>>m;
11     for(i=0;i<n;i++){
12         for(j=0;j<m;j++){
13             cin>>a[i][j];
14         }
15     } 
16     //遍历每行 
17     for(i=0;i<n;i++){
18         for(j=0;j<m-2;j++){
19             if((f(a[i][j])==f(a[i][j+1]))&&(f(a[i][j+2])==f(a[i][j+1]))){
20                 //变负,记录消除
21                 a[i][j]=a[i][j]>0?-a[i][j]:a[i][j]; 
22                 a[i][j+1]=a[i][j+1]>0?-a[i][j+1]:a[i][j+1]; 
23                 a[i][j+2]=a[i][j+2]>0?-a[i][j+2]:a[i][j+2]; 
24             }
25         } 
26     }
27     //遍历每列 
28     for(i=0;i<n-2;i++){
29         for(j=0;j<m;j++){
30             if((f(a[i][j])==f(a[i+1][j]))&&(f(a[i+2][j])==f(a[i][j]))){
31                 //变负,记录消除
32                 a[i][j]=a[i][j]>0?-a[i][j]:a[i][j]; 
33                 a[i+1][j]=a[i+1][j]>0?-a[i+1][j]:a[i+1][j]; 
34                 a[i+2][j]=a[i+2][j]>0?-a[i+2][j]:a[i+2][j]; 
35             }
36         } 
37     }
38     for(i=0;i<n;i++){
39         for(j=0;j<m;j++){
40             if(a[i][j]<0){
41                 cout<<0<<' ';
42             }else{
43                 cout<<a[i][j]<<' ';
44             }
45         }
46         cout<<"\b\n";
47     }
48     return 0;
49 }
 1 //CCF201509-2日期计算(简单计算) 
 2 #include<iostream>
 3 using namespace std;
 4 int tab[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
 5 int main(){
 6     int n,m,i;
 7     cin>>n>>m;
 8     if((n%4==0&&n%100!=0)||(n%400==0)){
 9         tab[1]++;
10     }
11     for(i=0;i<12;i++){
12         if(m<=tab[i]){
13             break;
14         }else{
15             m-=tab[i];
16         }
17     }
18     cout<<i+1<<endl;
19     cout<<m<<endl;
20     return 0;
21 }
 1 //CCF201503-2数字排序(用map统计后加入优先队列) 
 2 /*
 3 优先队列在头文件#include <queue>中;
 4 其声明格式为:priority_queue <int> ans;
 5 empty( )  //判断一个队列是否为空
 6 pop( )  //删除队顶元素
 7 push( )  //加入一个元素
 8 size( )  //返回优先队列中拥有的元素个数
 9 top( )  //返回优先队列的队顶元素 
10 顺序定义略 
11 */ 
12 #include<iostream>
13 #include<map>
14 #include<queue>
15 using namespace std;
16 struct node{
17     int key;
18     int num;
19     bool operator < (const node& n) const{
20         //num大的优先级高 
21         if(num==n.num)
22             return key>n.key;//返回小的key
23         else
24             return num<n.num;//返回大的num 
25     }
26 };
27 
28 int main(){
29     priority_queue<node> p;
30     map<int,int> m;
31     int n,i,temp;
32     node tp;
33     cin>>n;
34     for(i=0;i<n;i++){
35         cin>>temp;
36         m[temp]++;
37     }
38     for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
39         tp.key=it->first;
40         tp.num=it->second;
41         p.push(tp);
42     }
43     while(!p.empty()){
44         tp=p.top();
45         p.pop();
46         cout<<tp.key<<' '<<tp.num<<endl;
47     }
48     return 0;
49 } 
 1 //CCF201412-2Z字形扫描(找规律) 
 2 #include<iostream>
 3 using namespace std;
 4 int a[501][501];
 5 int direction[4][2]={0,1,1,0,1,-1,-1,1};//东,南,西南,东北 
 6 int main(){
 7     int n,i,j,next=0;
 8     cin>>n;
 9     for(i=0;i<n;i++){
10         for(j=0;j<n;j++){
11             cin>>a[i][j];
12         }
13     }
14     i=0;
15     j=0; 
16     cout<<a[i][j]<<' ';
17     while(i!=(n-1)||j!=(n-1)){
18         i+=direction[next][0];
19         j+=direction[next][1];
20         cout<<a[i][j]<<' ';
21         if((next==0&&i==0)||(next==1&&j==n-1))
22             next=2;
23         else if((next==1&&j==0)||(next==0&&i==n-1))
24             next=3; 
25         else if((next==3&&i==0)||(next==2&&i==n-1))
26             next=0;
27         else if((next==2&&j==0)||(next==3&&j==n-1))
28             next=1;
29         //其余情况next不变 
30     }
31     cout<<endl;
32     return 0;
33 }
 1 //CCF201409-2画图(简单数组标记) 
 2 //注意点为边界,矩形宽为x2-x1+1 
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6 int a[101][101]; 
 7 int main(){
 8     int i,j,k,n,x1,x2,y1,y2,max_x=0,max_y=0,ans=0;
 9     memset(a,0,sizeof(a));
10     cin>>n;
11     for(k=0;k<n;k++){
12         cin>>x1>>y1>>x2>>y2;
13         max_x=x2>max_x?x2:max_x;
14         max_y=y2>max_y?y2:max_y;
15         for(i=x1;i<x2;i++){
16             for(j=y1;j<y2;j++){
17                 a[i][j]=1;
18             }
19         }
20     }
21     for(i=0;i<=max_x;i++){
22         for(j=0;j<=max_y;j++){
23             if(a[i][j])
24                 ans++;
25         }
26     }
27     cout<<ans<<endl;
28     return 0;
29 } 
 1 //CCF201403-2窗口(将位置变化转换为索引数组变化) 
 2 //按什么顺序排列就把哪个作为index,然后用值来传递关系 
 3 #include<iostream>
 4 using namespace std;
 5 struct window{
 6     int id;
 7     int x1,x2,y1,y2;
 8 };
 9 window win[11];
10 int order[11];//要按优先级遍历,i为优先级,order[i] 为对应的win的index 
11 int main(){
12     int n,m,i,j,k,tx,ty,temp,ans;
13     cin>>n>>m;
14     for(i=1;i<=n;i++){
15         cin>>win[i].x1>>win[i].y1>>win[i].x2>>win[i].y2;
16         win[i].id=i;
17         order[i]=i;
18     }
19     for(i=0;i<m;i++){
20         cin>>tx>>ty;
21         ans=-1;
22         for(j=n;j>0;j--){
23             if(win[order[j]].x1<=tx&&tx<=win[order[j]].x2&&win[order[j]].y1<=ty&&ty<=win[order[j]].y2){
24                 ans=win[order[j]].id;
25                 temp=order[j];
26                 for(k=j;k<n;k++){
27                     order[k]=order[k+1];
28                 }
29                 order[n]=temp;
30                 break;
31             }
32         }
33         if(ans==-1){
34             cout<<"IGNORED\n";
35         }else{
36             cout<<ans<<endl;
37         }
38     }
39     return 0;
40 } 
 1 //CCF201312-2ISBN号码(简单字符转换) 
 2 #include<iostream> 
 3 using namespace std;
 4 char str[14];
 5 int main(){
 6     int i,num=1,ans=0;
 7     cin>>str;
 8     for(i=0;i<11;i++){
 9         if(str[i]>='0'&&str[i]<='9'){
10             ans+=int(str[i]-'0')*num;
11             num++;
12         }
13     }
14     ans%=11;
15     if(ans==10){
16         if(str[12]=='X'){
17             cout<<"RIGHT\n";
18         }else{
19             str[12]='X';
20             cout<<str<<endl;
21         }
22     }else{
23         if(int(str[12]-'0')==ans){
24             cout<<"Right\n";
25         }else{
26             str[12]=char(ans+'0');
27             cout<<str<<endl;
28         }
29     }
30     return 0;
31 } 

 

转载于:https://www.cnblogs.com/gf-fish/articles/7946273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值