A.雨天
dfs的简单运用
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#include <functional>
using namespace std;
#define maxn 1005
int a[maxn][maxn];
int ans1,ans2;
int n,m;
void dfs(int x,int y)
{
a[x][y]=2;
if (x-1>=0){
if (a[x-1][y]==1){
ans1++;
dfs(x-1,y);
} else if (a[x-1][y]==0) ans2++;
} else ans2++;
if (x+1<n){
if (a[x+1][y]==1){
ans1++;
dfs(x+1,y);
} else if (a[x+1][y]==0) ans2++;
} else ans2++;
if (y-1>=0){
if (a[x][y-1]==1){
ans1++;
dfs(x,y-1);
} else if (a[x][y-1]==0) ans2++;
} else ans2++;
if (y+1<m){
if (a[x][y+1]==1){
ans1++;
dfs(x,y+1);
} else if (a[x][y+1]==0) ans2++;
} else ans2++;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&m)!=EOF){
memset(a,0,sizeof(a));
for (int i=0;i<n;i++){
char ss[maxn];
scanf("%s",ss);
for (int s=0;s<m;s++){
a[i][s]=ss[s]-'0';
}
}
int ans11=0,ans22=0;
for (int i=0;i<n;i++){
for (int s=0;s<m;s++){
if (a[i][s])
{
ans1=1,ans2=0;
dfs(i,s);
ans11=max(ans11,ans1);
ans22=max(ans22,ans2);
}
}
}
printf("%d %d\n",ans11,ans22);
}
}
B.ACM的规则
简单贪心算法
首先对做出每题所花的时间重小到大排序,算出最好的成绩,再倒过来排序算出最差成绩即可
需要注意的是,这里的提交次数是总提交次数,错误的提交才会有罚时加20钟,所以你需要用总提交次数减去正确做出的题目数
另外,这里的时间是每题做出来所需时间,不是做出该题的时间
#include <bits/stdc++.h>
using namespace std;
int cmp(int xx,int yx)
{
return xx>yx;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int x,y;
int a[15];
while(scanf("%d%d",&x,&y)!=EOF){
for (int i=0;i<x;i++){
scanf("%d",&a[i]);
}
sort(a,a+x);
int ans=0,b=0;
for (int i=0;i<x;i++){
b+=a[i];
ans+=b;
}
printf("%d ",ans+(y-x)*20);
sort(a,a+x,cmp);
ans=0,b=0;
for (int i=0;i<x;i++){
b+=a[i];
ans+=b;
}
printf("%d\n",ans+(y-x)*20);
}
return 0;
}
这题是codeforces上的一道原题
codeforces Round #276 (div 2) D题
预处理出离算出自己最近的左边的一个点的值即可
#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
int a[maxn];
int d[maxn*10];
int na[maxn*10];
int main()
{
memset(d,0,sizeof(d));
int n;scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
d[a[i]]=1;
}
for (int i=1;i<=2000000;i++){
if (d[i-1]) na[i]=i-1;
else na[i]=na[i-1];
}
int ans=0;
for (int i=2;i<1000000;i++){
if (d[i]&&ans<(i-1)){
for (int s=i*2;s<1000000+i;s+=i){
ans=max(ans,na[s]%i);
if (ans==i-1) break;
}
}
}
printf("%d\n",ans);
return 0;
}
D.国王的奖励
这题是巫泽俊的书上面矩阵幂题目的翻版,几乎可以套用上面的代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
#define maxn 1000000007
ll x,y,z,aa,b,c;
mat mul(mat &a,mat &b)
{
mat c(a.size(),vec(b[0].size()));
for (int i=0;i<a.size();i++){
for (int k=0;k<b.size();k++){
for (int j=0;j<b[0].size();j++){
c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%maxn)%maxn;
}
}
}
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;
}
ll solve(ll n)
{
mat a(3,vec(3)); //指定横纵坐标的大小
a[0][0]=aa;a[0][1]=b;a[0][2]=c;
a[1][0]=1;a[1][1]=0;a[1][2]=0;
a[2][0]=0;a[2][1]=1;a[2][2]=0;
a=pow(a,n);
return ( (a[0][0]*x)%maxn + (a[0][1]*y)%maxn + (a[0][2]*z)%maxn )%maxn;
}
int main()
{
ll n;
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%I64d",&n)){
scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&x,&y,&z,&aa,&b,&c);
if (n==3){
printf("%d\n",x);
return 0;
}
if (n==2){
printf("%d\n",y);
return 0;
}
if (n==1){
printf("%d\n",z);
return 0;
}
printf("%I64d\n",solve(n-3));
}
return 0;
}
E.激动的比赛
约瑟夫环问题,没得啥好说的了,数学题,具体数学的书上看参考答案
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
ll n;
while(~scanf("%I64d",&n)){
ll len=0;
ll ans=0;
ll data=1;
for (ll i=0;i<63;i++){
if ((data<<i)>n){
len=i-1;
break;
}
}
ans=(n-(data<<len));
printf("%I64d\n",(ans<<data)+data);
}
return 0;
}
F.画圈圈诅咒出题人
搞笑题,暴力算一次就可以了
#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
typedef long long ll;
struct node
{
int x,y;
};
int main()
{
int n;
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(~scanf("%d",&n)){
node a[maxn];
for (int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
ll sum=0;
for (int i=0;i<n;i++){
for (int s=i;s<n;s++){
sum=max(sum,(ll)((a[i].x-a[s].x)*(a[i].x-a[s].x)+(a[i].y-a[s].y)*(a[i].y-a[s].y)));
}
}
printf("%I64d\n",sum);
}
return 0;
}