A 时间统计
https://ac.nowcoder.com/acm/contest/105/A
直接计算即可
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int day1=0,day1h=0,day1m=0,day1s=0;
int day2=0,day2h=0,day2m=0,day2s=0;
scanf("%dday%d:%d:%d",&day1,&day1h,&day1m,&day1s);
scanf("%dday%d:%d:%d",&day2,&day2h,&day2m,&day2s);
long long sum=(day2-day1)*3600*24;
sum+=(day2h-day1h)*3600;
sum+=(day2m-day1m)*60;
sum+=(day2s-day1s);
printf("%lld\n",sum);
}
return 0;
}
B String
https://ac.nowcoder.com/acm/contest/105/B
直接根据题意模拟即可
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<stack>
using namespace std;
int num1[6][6];
char s1[10][10];
void init()
{
s1[0][0]='0',s1[0][1]='1',s1[0][2]='2',s1[0][3]='3',s1[0][4]='4',s1[0][5]='5';
s1[1][0]='6',s1[1][1]='7',s1[1][2]='8',s1[1][3]='9',s1[1][4]='A',s1[1][5]='B';
s1[2][0]='C',s1[2][1]='D',s1[2][2]='E',s1[2][3]='F',s1[2][4]='G',s1[2][5]='H';
s1[3][0]='I',s1[3][1]='J',s1[3][2]='K',s1[3][3]='L',s1[3][4]='M',s1[3][5]='N';
s1[4][0]='O',s1[4][1]='P',s1[4][2]='Q',s1[4][3]='R',s1[4][4]='S',s1[4][5]='T';
s1[5][0]='U',s1[5][1]='V',s1[5][2]='W',s1[5][3]='X',s1[5][4]='Y',s1[5][5]='Z';
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
memset(num1,0,sizeof(num1));
string s2;
cin>>s2;
for(int j=0;j<s2.size();j++)
{
switch(s2[j])
{
case '0':
for(int i=0;i<=5;i++)
num1[i][0]++;
for(int i=0;i<=5;i++)
num1[0][i]++;
break;
case '1':
for(int i=0;i<=5;i++)
num1[i][1]++;
for(int i=0;i<=5;i++)
num1[0][i]++;
break;
case '2':
for(int i=0;i<=5;i++)
num1[i][2]++;
for(int i=0;i<=5;i++)
num1[0][i]++;
break;
case '3':
for(int i=0;i<=5;i++)
num1[i][3]++;
for(int i=0;i<=5;i++)
num1[0][i]++;
break;
case '4':
for(int i=0;i<=5;i++)
num1[i][4]++;
for(int i=0;i<=5;i++)
num1[0][i]++;
break;
case '5':
for(int i=0;i<=5;i++)
num1[i][5]++;
for(int i=0;i<=5;i++)
num1[0][i]++;
break;
case '6':
for(int i=0;i<=5;i++)
num1[i][0]++;
for(int i=0;i<=5;i++)
num1[1][i]++;
break;
case '7':
for(int i=0;i<=5;i++)
num1[i][1]++;
for(int i=0;i<=5;i++)
num1[1][i]++;
break;
case '8':
for(int i=0;i<=5;i++)
num1[i][2]++;
for(int i=0;i<=5;i++)
num1[1][i]++;
break;
case '9':
for(int i=0;i<=5;i++)
num1[i][3]++;
for(int i=0;i<=5;i++)
num1[1][i]++;
break;
case 'A':
for(int i=0;i<=5;i++)
num1[i][4]++;
for(int i=0;i<=5;i++)
num1[1][i]++;
break;
case 'B':
for(int i=0;i<=5;i++)
num1[i][5]++;
for(int i=0;i<=5;i++)
num1[1][i]++;
break;
case 'C':
for(int i=0;i<=5;i++)
num1[i][0]++;
for(int i=0;i<=5;i++)
num1[2][i]++;
break;
case 'D':
for(int i=0;i<=5;i++)
num1[i][1]++;
for(int i=0;i<=5;i++)
num1[2][i]++;
break;
case 'E':
for(int i=0;i<=5;i++)
num1[i][2]++;
for(int i=0;i<=5;i++)
num1[2][i]++;
break;
case 'F':
for(int i=0;i<=5;i++)
num1[i][3]++;
for(int i=0;i<=5;i++)
num1[2][i]++;
break;
case 'G':
for(int i=0;i<=5;i++)
num1[i][4]++;
for(int i=0;i<=5;i++)
num1[2][i]++;
break;
case 'H':
for(int i=0;i<=5;i++)
num1[i][5]++;
for(int i=0;i<=5;i++)
num1[2][i]++;
break;
case 'I':
for(int i=0;i<=5;i++)
num1[i][0]++;
for(int i=0;i<=5;i++)
num1[3][i]++;
break;
case 'J':
for(int i=0;i<=5;i++)
num1[i][1]++;
for(int i=0;i<=5;i++)
num1[3][i]++;
break;
case 'K':
for(int i=0;i<=5;i++)
num1[i][2]++;
for(int i=0;i<=5;i++)
num1[3][i]++;
break;
case 'L':
for(int i=0;i<=5;i++)
num1[i][3]++;
for(int i=0;i<=5;i++)
num1[3][i]++;
break;
case 'M':
for(int i=0;i<=5;i++)
num1[i][4]++;
for(int i=0;i<=5;i++)
num1[3][i]++;
break;
case 'N':
for(int i=0;i<=5;i++)
num1[i][5]++;
for(int i=0;i<=5;i++)
num1[3][i]++;
break;
case 'O':
for(int i=0;i<=5;i++)
num1[i][0]++;
for(int i=0;i<=5;i++)
num1[4][i]++;
break;
case 'P':
for(int i=0;i<=5;i++)
num1[i][1]++;
for(int i=0;i<=5;i++)
num1[4][i]++;
break;
case 'Q':
for(int i=0;i<=5;i++)
num1[i][2]++;
for(int i=0;i<=5;i++)
num1[4][i]++;
break;
case 'R':
for(int i=0;i<=5;i++)
num1[i][3]++;
for(int i=0;i<=5;i++)
num1[4][i]++;
break;
case 'S':
for(int i=0;i<=5;i++)
num1[i][4]++;
for(int i=0;i<=5;i++)
num1[4][i]++;
break;
case 'T':
for(int i=0;i<=5;i++)
num1[i][5]++;
for(int i=0;i<=5;i++)
num1[4][i]++;
break;
case 'U':
for(int i=0;i<=5;i++)
num1[i][0]++;
for(int i=0;i<=5;i++)
num1[5][i]++;
break;
case 'V':
for(int i=0;i<=5;i++)
num1[i][1]++;
for(int i=0;i<=5;i++)
num1[5][i]++;
break;
case 'W':
for(int i=0;i<=5;i++)
num1[i][2]++;
for(int i=0;i<=5;i++)
num1[5][i]++;
break;
case 'X':
for(int i=0;i<=5;i++)
num1[i][3]++;
for(int i=0;i<=5;i++)
num1[5][i]++;
break;
case 'Y':
for(int i=0;i<=5;i++)
num1[i][4]++;
for(int i=0;i<=5;i++)
num1[5][i]++;
break;
case 'Z':
for(int i=0;i<=5;i++)
num1[i][5]++;
for(int i=0;i<=5;i++)
num1[5][i]++;
break;
}
}
int maxn=-1;
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
if(maxn<num1[i][j])
maxn=num1[i][j];
}
}
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
if(maxn==num1[i][j])
printf("%c",s1[i][j]);
}
}
printf("\n");
}
return 0;
}
C Boom
https://ac.nowcoder.com/acm/contest/105/C
当时比赛没写出,其实对于每一个矩形,通过对于其边界长度的判定,求解出最大值,模拟
#include <cstdio>
#include <algorithm>
using namespace std;
int x1[55], _y1[55], x2[55], y2[55];
int main()
{
int T;
scanf("%d", &T);
while(T--){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %d %d %d", &x1[i], &_y1[i], &x2[i], &y2[i]);
}
int res = -1;
for(int x = 0; x <= 100; x++){
for(int y = 0; y <= 100; y++){
int cnt = 0;
for(int i = 0; i < n; i++){
if(x > x1[i] && x <= x2[i] && y > _y1[i] && y <=y2[i]){
cnt++;
}
}
res = max(cnt, res);
}
}
printf("%d\n", res);
}
return 0;
}
D Fibonacci进制
https://ac.nowcoder.com/acm/contest/105/D
首先求解出前50个斐波那契数作为因子,之后根据输入的数N,从小到大遍历,如果大于这一位的因数,就减去,直到结果小于等于0。如果等于0,直接转换即可。否则将其从大到小在相减直到其为0。最后根据1和0从二进制转化为十进制即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
int T;
long long f[50]={0,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,
75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,
63245986,102334155,165580141,267914296,433494437,701408733};
int temp[50];
long long ans;
long long n;
int main()
{
cin>>T;
while(T--)
{
memset(temp,0,sizeof(temp));
cin>>n;
for(int i=1;i<=43;i++)
{
temp[i]=1;
n-=f[i];
if(n<=0)
break;
}
n=fabs(n);
for(int i=43;i>=0;i--)
{
if(n>=f[i])
{
n-=f[i];
temp[i]=0;
}
}
ans=0;
for(int i=43;i>=1;i--)
{
ans=ans*2+temp[i];
}
cout<<ans<<endl;
}
return 0;
}
E 吃货
https://ac.nowcoder.com/acm/contest/105/E
首先排序,按照价格从大到小的顺序进行排序。之后对于整个的商品进行遍历,求解出当目前为止,小于等于当前价位的美味的最大值数组。用一个单独的数组存放价格,进行二分查找,输出在这个位置上的美味数组的最大值即为答案。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=30000;
long long num[MAXN+11];
struct node{
long long d,c;
};
vector<node> p;
vector<long long> value1;
bool cmp(node a,node b) {
return a.d<b.d;
}
int main() {
int t;
while(~scanf("%d",&t)) {
while(t--) {
int n,m;
scanf("%d%d",&n,&m);
p.clear();
value1.clear();
for(int i=0;i<n;i++) {
node temp;
scanf("%lld%lld",&temp.d,&temp.c);
p.push_back(temp);
}
sort(p.begin(),p.end(),cmp);
num[0]=p[0].c;
value1.push_back(p[0].d);
for(int i=1;i<n;i++) {
num[i]=max(num[i-1],p[i].c);
value1.push_back(p[i].d);
}
while(m--) {
long long money;
scanf("%lld",&money);
int add1=lower_bound(value1.begin(),value1.end(),money)-value1.begin();
if(p[add1].d==money)
printf("%lld\n",num[add1]);
else
printf("%lld\n",num[add1-1]);
}
}
}
return 0;
}
F maze
https://ac.nowcoder.com/acm/contest/105/F
搜索题,运用优先队列进行的搜索。对于每次搜索不是按照上下左右的四个顺序,而是按照时间的先后进行搜索,这样就可以解决对于当前的传送点是否进行传送的问题。第一次写先遍历整张图,然后对于每个传送点,排除无法传送的,按照时间先后再进行判定。这样只通过了66.67%的数据,使用优先队列按照时间顺序后可以确定是否能够到达终点并且终点是否最优。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=311;
const int INF=0x3f3f3f3f;
struct Node{
int x,y,t;
bool operator < (const Node &e) const{
return t > e.t;//小
}
};
int n,m,q;
int startx,starty,endx,endy;
char ch[MAXN][MAXN];
int vis[MAXN][MAXN];
int s[MAXN][MAXN][2];
int next1[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs(){
priority_queue<Node> pq;
pq.push({startx,starty,0});
if(s[startx][starty][0]!=-1)
pq.push({s[startx][starty][0],s[startx][starty][1],3});
while(!pq.empty()){
Node u = pq.top();
pq.pop();
if(u.x==endx && u.y==endy){
printf("%d\n",u.t);
return;
}
int sx = s[u.x][u.y][0],sy=s[u.x][u.y][1];
if(sx!=-1 && vis[sx][sy]>u.t+3){
pq.push({sx,sy,u.t+3});//传送
vis[sx][sy] = u.t+3;
}
for(int i=0;i<4;i++){
int x = u.x + next1[i][0];
int y = u.y + next1[i][1];
if(x>=0 && x<n && y>=0 && y<m && ch[x][y]!='#'){
if(vis[x][y]>u.t+1){
vis[x][y] = u.t+1;
pq.push({x,y,u.t+1});
}
}
}
}
puts("-1");
}
int main(){
while(~scanf("%d%d%d",&n,&m,&q)){
memset(vis,INF,sizeof(vis));
memset(s,-1,sizeof(s));
getchar();
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++){
scanf("%c",&ch[i][j]);
if(ch[i][j]=='S')
startx=i,starty=j;
if(ch[i][j]=='T')
endx=i,endy=j;
}
getchar();
}
for(int i=0;i<q;i++){
int u,v,uu,vv;
scanf("%d%d%d%d",&u,&v,&uu,&vv);
if(ch[u][v]!='#' &&ch[uu][vv]!='#'){
s[u][v][0]=uu;
s[u][v][1]=vv;
}
}
bfs();
}
return 0;
}
G 又见斐波那契
https://ac.nowcoder.com/acm/contest/105/G
矩阵快速幂(按照数据范围其实我觉得应该会超时......)数据有点水
矩阵构造方法:https://www.cnblogs.com/frog112111/archive/2013/05/19/3087648.html
构造方法中第三种情况
最终构造出一个6*6的矩阵
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef vector<LL> vec;
typedef vector<vec> mat;
long long M=1000000007;
mat mul(mat &A,mat &B)
{
LL r;
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();i++)
for(int k=0;k<B.size();k++) {
r = A[i][k];
for (int j = 0; j < B[0].size(); j++)
C[i][j] = (C[i][j] + r * B[k][j] + 1000000007) % M;
}
return C;
}
mat pow(mat A,LL n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();i++) B[i][i]=1;
while(n>0)
{
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main()
{
long long n;
int t;
scanf("%d",&t);
while(t--) {
scanf("%lld",&n);
if(n==1) {
printf("1\n");
continue;
}
mat A(6,vec(6));//系数
mat C(1,vec(6));//像鼠标
A[0][0]=1,A[0][1]=1,A[0][2]=0,A[0][3]=0,A[0][4]=0,A[0][5]=0;
A[1][0]=1,A[1][1]=0,A[1][2]=0,A[1][3]=0,A[1][4]=0,A[1][5]=0;
A[2][0]=1,A[2][1]=0,A[2][2]=1,A[2][3]=0,A[2][4]=0,A[2][5]=0;
A[3][0]=1,A[3][1]=0,A[3][2]=3,A[3][3]=1,A[3][4]=0,A[3][5]=0;
A[4][0]=1,A[4][1]=0,A[4][2]=3,A[4][3]=2,A[4][4]=1,A[4][5]=0;
A[5][0]=1,A[5][1]=0,A[5][2]=1,A[5][3]=1,A[5][4]=1,A[5][5]=1;
C[0][0]=1,C[0][1]=0,C[0][2]=8,C[0][3]=4,C[0][4]=2,C[0][5]=1;
A=pow(A,n-1);
C=mul(C,A);
cout<<C[0][0]<<endl;
}
return 0;
}
H 统计颜色
https://ac.nowcoder.com/acm/contest/105/H
线段树----不会,代补