T1 (Pencil)
随便做
#include
using namespace std;
int n,a,b,ans=2147483647;
int main(){
freopen("pencil.in","r",stdin);
freopen("pencil.out","w",stdout);
scanf("%d",&n);
for (int i=1; i<=3; i++) {
scanf("%d%d",&a,&b);
int k=0,s=0;
for (; kif (sprintf("%d",ans);
return 0;
}
T2(date)
枚举每个 月(1=>12)、日(1=>day[i]),再判断此日期符不符合(把月日反过来就是年)
注意二月二十九号推出的日期是 92200229,9220年是个闰年,可以直接用就行了
#include
using namespace std;
int day[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int A,B,ans,maxy,miny,maxm,minm,maxd,mind;
int check(int m,int d){
int y;
y=(d%10)*1000+(d/10)*100+(m%10)*10+(m/10);
if (y>miny && yreturn 1;
if (y==miny){
if (m>minm) return 1;
if (m==minm && d>=mind) return 1;
}
if (y==maxy){
if (mreturn 1;
if (m==maxm && d<=maxd) return 1;
}
return 0;
}
int main(){
freopen("date.in","r",stdin);
freopen("date.out","w",stdout);
ans=0;
scanf("%d%d",&A,&B);
maxy=B/10000, maxm=(B%10000)/100, maxd=B%100;
miny=A/10000, minm=(A%10000)/100, mind=A%100;
for (int i=1; i<=12; i++) //枚举月
for (int j=1; j<=day[i]; j++) //枚举日
ans+=check(i,j);
printf("%d",ans);
return 0;
}
T3(port)
边读边算(利用题目中t[i]是递增的)
head 符合题目到达最早的船的编号
t: 每艘船时间
p: 每艘船第一个人的编号
q: 每个国家的人数
w: 每人来自的国家
ans: 当前的答案
du()是读入优化,也用来压行
#include
int n,ans,head;
int t[100010],p[100010],q[100010],w[500000];
int du(){
int rd=0;
char ch=getchar();
while (ch<48 || ch>57) ch=getchar();
while (ch>47 && ch<58) rd=rd*10+ch-'0',ch=getchar();
return rd;
}
int main(){
freopen("port.in","r",stdin);
freopen("port.out","w",stdout);
n=du();
p[1]=1, head=1;
for (int i=1; i<=n; i++){
t[i]=du();
int rs=du();
p[i+1]=p[i]+rs;
for (int j=1; j<=rs; j++) if (!q[w[j+p[i]-1]=du()]++) ans++;
while (t[i]-t[head]>=86400){
for (int k=p[head]; k1]; k++) if (--q[w[k]]==0) ans--;
head++;
}
printf("%d\n",ans);
}
}
T4(magic) 还未AC,先给个50分程序……
其中用了些剪枝:
xa< xb< xc< xd 没得说
xb-xa=2(xd-xc) 说明(xb-xa)为偶数
xb-xa<(xc-xb)/3 可在枚举c时判断
#include
int A[15010],B[15010],C[15010],D[15010],x[15010];
int n,m;
int main(){
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1; i<=m; i++)scanf("%d",&x[i]);
for (int a=1; a<=m; a++)
for (int b=1; b<=m; b++) if (x[b]>x[a] && (x[b]-x[a])%2==0)
for (int c=1; c<=m; c++) if (x[c]>x[b] && (x[b]-x[a])*3<(x[c]-x[b]))
for (int d=1; d<=m; d++) if (x[d]>x[c] && (x[b]-x[a]==2*(x[d]-x[c]))){
A[a]++;
B[b]++;
C[c]++;
D[d]++;
}
for (int i=1; i<=m; i++) printf("%d %d %d %d\n",A[i],B[i],C[i],D[i]);
}