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