//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 }