回忆第一届新生赛,在前往icpc的途中和队友讨论如何出题“为难”新生,尔来已经两年的,不觉感慨时间飞逝。
Problem A A + B problem
思路:1000以内特定三数和组合,直接暴力前两数统计即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int D;
scanf("%d",&D);
int sum = 0;
for(int i=1;i<=D-2;i++)
{
for(int j=1;j<=D-i-1;j++)
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}
Problem B The C Programming Test
思路:小模拟:排序,去重,次大次小值均可在输入中处理掉,再按数大小二次循环统计出众数
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
const int maxm = 1e4+10;
int a[maxn];
int num[maxm];
vector<int> B,D;
int main()
{
int n,Cma1=-1,Cma2=-1,Cmi1=1e5,Cmi2=1e5,Dnum=0;
scanf("%d",&n);
memset(num,0,sizeof num);
B.clear();
D.clear();
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>Cma1)
{
Cma2 = Cma1;
Cma1 = a[i];
}
else if(a[i]>Cma2) Cma2 = a[i];
if(a[i]<Cmi1)
{
Cmi2 = Cmi1;
Cmi1 = a[i];
}
else if(a[i]<Cmi2) Cmi2 = a[i];
num[a[i]]++;
if(num[a[i]]==1)
B.push_back(a[i]);
}
for(int i=0;i<1e4+2;i++)
{
if(num[i]>Dnum)
{
Dnum = num[i];
D.clear();
D.push_back(i);
}
else if(num[i]==Dnum) D.push_back(i);
}
sort(a,a+n);
for(int i=0;i<n-1;i++) printf("%d ",a[i]);
printf("%d\n",a[n-1]);
int len = B.size();
for(int i=0;i<len-1;i++) printf("%d ",B[i]);
printf("%d\n",B[len-1]);
printf("%d %d\n",Cma2,Cmi2);
int len2 = D.size();
for(int i=0;i<len2-1;i++) printf("%d ",D[i]);
printf("%d\n",D[len2-1]);
return 0;
}
Problem C Music List
思路:求多次区间扫描后的点排序,这题我确实是个很巧妙且很实用的方法,记得我第一次做到这种题型的时候也很喜欢,类似于信号系统中频域变换,记录变化点之后扫描累加。当然,一定要注意输出格式
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int k[maxn];
int re[maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(k,0,sizeof k);
for(int i=0;i<m;i++) scanf("%d",&k[i]);
sort(k,k+m,greater<int>());
memset(re,0,sizeof re);
int pos = 0;
int now = 0;
for(int i=1e5+1;i>0;i--)
{
while(i==k[pos])
{
now++;
pos++;
}
re[i] = now;
}
for(int i=1;i<=n;i++) printf("%d\n",re[i]);
return 0;
}
Problem D Square Problem
思路:求平面内平行于坐标轴的正方形个数,于是暴力正方形对角线两点枚举计算即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
bool m[maxn][maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(m,false,sizeof m);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
m[x][y] = true;
}
int sum = 0;
for(int a=0;a<=99;a++)
{
for(int b=a+1;b<=100;b++)
{
int len = b-a;
for(int c=0;c<=100-len;c++)
if(m[a][c]&&m[b][c]&&m[a][c+len]&&m[b][c+len])
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}
1256: Roman Numbers
思路:看似复杂的罗马数字表示法,其实也有很细致的规律,那就是按位表示,互不干扰。想清楚这个道理之后,一切就都豁然开朗了,接下来模拟即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ne = n%1000;
int p = n/1000;
n = ne;
for(int i=0;i<p;i++) printf("M");
ne = n%100;
p = n/100;
n = ne;
if(p<=3)
for(int i=0;i<p;i++) printf("C");
else if(p==4) printf("CD");
else if(p>=5&&p<=8)
{
printf("D");
for(int i=5;i<p;i++) printf("C");
}
else if(p==9) printf("CM");
ne = n%10;
p = n/10;
n = ne;
if(p<=3)
for(int i=0;i<p;i++) printf("X");
else if(p==4) printf("XL");
else if(p>=5&&p<=8)
{
printf("L");
for(int i=5;i<p;i++) printf("X");
}
else if(p==9) printf("XC");
p = n;
if(p<=3)
for(int i=0;i<p;i++) printf("I");
else if(p==4) printf("IV");
else if(p>=5&&p<=8)
{
printf("V");
for(int i=5;i<p;i++) printf("I");
}
else if(p==9) printf("IX");
printf("\n");
}
return 0;
}
Problem H Rubik’s Cube
思路:判断一步操作还原魔方的可能性,那么直接模拟,一共只有六种转魔方的方式,判断每种转法完成后每种颜色是否位于同一面即可
#include <bits/stdc++.h>
using namespace std;
int a[24];
vector<int> num[6];
int main()
{
for(int i=0;i<24;i++) scanf("%d",&a[i]);
bool ok = true;
bool re = false;
for(int check=0;check<6;check++)
{
//cout << "&" << check << "&" << endl;
for(int i=0;i<6;i++) num[i].clear();
bool okk = true;
if(check==0)
{
for(int i=0;i<24;i++)
{
if((i-0)*(i-1)*(i-17)*(i-19)*(i-10)*(i-11)*(i-12)*(i-14)!=0)
num[a[i]-1].push_back(i);
else if(i==0)
num[a[i]-1].push_back(17);
else if(i==1)
num[a[i]-1].push_back(19);
else if(i==17)
num[a[i]-1].push_back(11);
else if(i==19)
num[a[i]-1].push_back(10);
else if(i==11)
num[a[i]-1].push_back(14);
else if(i==10)
num[a[i]-1].push_back(12);
else if(i==14)
num[a[i]-1].push_back(0);
else if(i==12)
num[a[i]-1].push_back(1);
}
}
else if(check==1)
{
for(int i=0;i<24;i++)
{
if((i-0)*(i-1)*(i-17)*(i-19)*(i-10)*(i-11)*(i-12)*(i-14)!=0)
num[a[i]-1].push_back(i);
else if(i==0)
num[a[i]-1].push_back(14);
else if(i==1)
num[a[i]-1].push_back(12);
else if(i==17)
num[a[i]-1].push_back(0);
else if(i==19)
num[a[i]-1].push_back(1);
else if(i==11)
num[a[i]-1].push_back(17);
else if(i==10)
num[a[i]-1].push_back(19);
else if(i==14)
num[a[i]-1].push_back(11);
else if(i==12)
num[a[i]-1].push_back(10);
}
}
else if(check==2)
{
for(int i=0;i<24;i++)
{
if((i-0)*(i-2)*(i-4)*(i-6)*(i-8)*(i-10)*(i-21)*(i-23)!=0)
num[a[i]-1].push_back(i);
else if(i==0)
num[a[i]-1].push_back(4);
else if(i==2)
num[a[i]-1].push_back(6);
else if(i==4)
num[a[i]-1].push_back(8);
else if(i==6)
num[a[i]-1].push_back(23);
else if(i==8)
num[a[i]-1].push_back(21);
else if(i==10)
num[a[i]-1].push_back(12);
else if(i==21)
num[a[i]-1].push_back(2);
else if(i==23)
num[a[i]-1].push_back(0);
}
}
else if(check==3)
{
for(int i=0;i<24;i++)
{
if((i-0)*(i-2)*(i-4)*(i-6)*(i-8)*(i-10)*(i-21)*(i-23)!=0)
num[a[i]-1].push_back(i);
else if(i==0)
num[a[i]-1].push_back(23);
else if(i==2)
num[a[i]-1].push_back(21);
else if(i==4)
num[a[i]-1].push_back(0);
else if(i==6)
num[a[i]-1].push_back(2);
else if(i==8)
num[a[i]-1].push_back(4);
else if(i==10)
num[a[i]-1].push_back(6);
else if(i==21)
num[a[i]-1].push_back(10);
else if(i==23)
num[a[i]-1].push_back(8);
}
}
else if(check==4)
{
for(int i=0;i<24;i++)
{
if((i-4)*(i-5)*(i-16)*(i-17)*(i-20)*(i-21)*(i-12)*(i-13)!=0)
num[a[i]-1].push_back(i);
else if(i==4)
num[a[i]-1].push_back(16);
else if(i==5)
num[a[i]-1].push_back(17);
else if(i==16)
num[a[i]-1].push_back(20);
else if(i==17)
num[a[i]-1].push_back(21);
else if(i==20)
num[a[i]-1].push_back(12);
else if(i==21)
num[a[i]-1].push_back(13);
else if(i==12)
num[a[i]-1].push_back(4);
else if(i==13)
num[a[i]-1].push_back(5);
}
}
else if(check==5)
{
for(int i=0;i<24;i++)
{
if((i-4)*(i-5)*(i-16)*(i-17)*(i-20)*(i-21)*(i-12)*(i-13)!=0)
num[a[i]-1].push_back(i);
else if(i==4)
num[a[i]-1].push_back(12);
else if(i==5)
num[a[i]-1].push_back(13);
else if(i==16)
num[a[i]-1].push_back(4);
else if(i==17)
num[a[i]-1].push_back(5);
else if(i==20)
num[a[i]-1].push_back(16);
else if(i==21)
num[a[i]-1].push_back(17);
else if(i==12)
num[a[i]-1].push_back(20);
else if(i==13)
num[a[i]-1].push_back(21);
}
}
// for(int i=0;i<6;i++)
// printf("%d/",num[i].size());
for(int i=0;okk&&i<6;i++)
if(num[i].size()!=4)
okk = false;
for(int i=0;okk&&i<6;i++)
{
int pos = num[i][0]/4;
//cout << num[i][0] << "*";
for(int j=1;ok&&j<4;j++)
{
if((num[i][j]/4)!=pos)
okk = false;
//cout << num[i][j] << "*";
}
}
//cout << okk << endl;
if(okk) re = true;
}
if(ok&&re)
printf("YES\n");
else
printf("NO\n");
return 0;
}