F - Reports
题意:
假设你在一所学校上学,这所学校比较隔路,你每一次进入校门需要向门卫报备1,离开学校需要向门卫报备0(点谁我就不明说了O~O)然后需要判断你的这个报备的合理性,也就是说你不可能同时离开学校两次或者进入学校两次,因为这不符合现实,除非你翻墙了,好学生是不能瞎操作的嗷!
做法:
判断是否相邻的相同即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
ios::sync_with_stdio(false);
int t,n,a[50];
cin>>t;
while(t--)
{
bool flag=true;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
{
if(a[i]==a[i+1])
{
flag=false;
break;
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
/**
4 9
1:1 1 1 1
2 3
1:1 1 / 1 1 1
3 9 27
1:1 1 1
*/
B - Express Mail Taking
题意:
现在你是一位快递员,因为快递点比较先进,所以快递都是直接闪现到快递点的柜子里的。快递点一共有1~ n个柜子,其中比较特殊的是所有柜子都有锁,而你能通过第k个柜子进行柜子的解锁(不同的柜子需要重新解锁,这很重要!!!)你只能从第1个柜子的位置开始取快递,当你取完所有快递时你才能从你进来的地方也就是1号柜离开,问取完所有快递且到达终点你的最短路程是多少?
做法:
这道题深深地刺激了我,细节处理真的真的很重要!
样例解释:10 (一共10个柜子)2 (其中有两个柜子里有快递)5 (特殊柜子,也就是能解锁的柜子是5号柜子)
6 7 (两个快递的位置)
步骤:首先先到5号打开6号,取完之后再一次回到5号打开7号,7号取完之后,已经取完全部快递了,所以直接去1号。所以总路程是4+1+1+2+6=14。
大概就能理解题目是怎么操作了,首先快递的取件的先后其实没啥影响,因为路程都是固定长度,唯一要处理的就是快递是否都在一侧,为什么这么说?因为当你取完最后一个快递时,是可以直接离开的,若快递都在特殊柜子k的右侧(也就是都大于k)取完之后你需要再走a[n]-1的路程;否则最后一段路就是k-1了,为啥呢?因为最后一个在左侧也就是说你可以直接先去k开柜子,开完直接拿上就直接去1就行了,少了一段返回的路程呢。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int t,n,a[maxn],m,k;
int main()
{
ios::sync_with_stdio(false);
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
int minn=n,flag=0;
for(int i=1; i<=m; i++)
scanf("%d",&a[i]),minn=min(a[i],minn);
sort(a+1,a+1+m);
ll sum;
sum=(k-1)*2;
if(minn>k)
sum+=(a[1]-k)*2;
for(int i=2; i<=m; i++)
{
if(a[i]>k)
sum+=(a[i]-k)*2;
else
sum+=(k-a[i])*2;
}
cout<<sum<<endl;
}
return 0;
}
/**
*/
E - CCPC Training Class
题意:
说实话这题面不想解释。。。直接根据样例猜的结果,给出一个字符串,将其重新排列,使得该字符串的border最大,border就是题目中字母的出现个数
做法:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int t,n,a[maxn],m,k,ca=0;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
ca++;
int num[26],ans=0;
string s;
memset(num,0,sizeof(num));
cin>>s;
for(int i=0;i<s.size();i++)
num[s[i]-'a']++;
for(int i=0;i<26;i++)
ans=max(ans,num[i]);
cout<<"Case #"<<ca<<": "<<ans<<endl;
}
return 0;
}
/**
*/
G - 3x3 Convolution
题意:
给定一个矩阵A(n×n)以及一个矩阵K(3×3)需要你根据题目中给定的公式去求解最后矩阵的和。
公式
输入的其实是K’矩阵,还得将K’转换成K矩阵
转换公式
做法:
直接模拟题目要求即可,输入矩阵,矩阵处理,最后得到答案,注意:scanf和cout不能混起来。。。会T
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int n,m,q;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int pos,sum=0;
int _k[4][4],k[4][4];
int n[55][55],ans[55][55]={0};
scanf("%d",&pos);
for(int i=1; i<=pos; i++)
for(int j=1; j<=pos; j++)
cin>>n[i][j];
for(int i=1; i<=3; i++)
for(int j=1; j<=3; j++)
{
cin>>_k[i][j];
sum+=_k[i][j];
}
for(int i=1; i<=3; i++)
for(int j=1; j<=3; j++)
k[i][j]=_k[i][j]/(sum*1.0);
for(int x=1; x<=pos; x++)
for(int y=1; y<=pos; y++)
for(int i=1; i<=min(pos-x+1,3); i++)
for(int j=1; j<=min(pos-y+1,3); j++)
ans[x][y]+=(n[x+i-1][y+j-1]*k[i][j]);
for(int i=1; i<=pos; i++)
{
for(int j=1; j<=pos; j++)
{
if(j==1)
printf("%d",ans[i][j]);
else
printf(" %d",ans[i][j]);
}
printf("\n");
}
}
return 0;
}
每日小结:
又是差一题的一天O~O,最近惰性有点重,自己在尝试着压制,这两天的课意外发现上个学期居然学了!然而上学期就这么算是最差的。。。。QAQ,但是不得不说Linux还是很有意思,就是没有图示化界面有点难受,好歹上学期还是能看个界面,这次直接界面都没了OMO这是逐步走向代码化了呀,不久就要下毕设题目了,希望自己能好好完成呀!愿明天的朝阳,能给我开心过完一天的好运!Thanks♪ ( ・ ω ・ )ノ。不差了不差了!!!