ZZU暑期快乐集训
学长们又在vj上拉比赛了,菜鸡的我补一补学长们说的水题。QAQ
第十届山东省ACM省赛
A - Calandar
有点类似于2050的一道题,就是因为是以5为周期的,所以年数和月数都对于最后的结果没有影响,有可以想到定义的是一个月有30天,所以每个月的同一天的星期数是一样的,可以搞一个数组存下一个月所有的的天数对应的星期数,然后直接查询就可以了
# include <bits/stdc++.h>
using namespace std;
int m[40];
int main()
{
int T;
scanf("%d",&T);
while(T--){
int y1,y2,m1,m2,d1,d2;
string s1;
scanf("%d %d %d",&y1,&m1,&d1);
cin>>s1;
scanf("%d %d %d",&y2,&m2,&d2);
int M;
if(s1=="Monday") M=1;
else if(s1=="Tuesday") M=2;
else if(s1=="Wednesday") M=3;
else if(s1=="Thursday") M=4;
else if(s1=="Friday") M=0;
int y=d1%5;
for(int i=1;i<=30;i++){
int y1=i%5;
int c=(y1-y)%5;
m[i]=(M+c+5)%5;
}
/*
for(int i=1;i<=30;i++){
printf("%d ",m[i]);
if(i%5==0) printf("\n");
}
*/
if(m[d2]==1) printf("Monday\n");
else if(m[d2]==2) printf("Tuesday\n");
else if(m[d2]==3) printf("Wednesday\n");
else if(m[d2]==4) printf("Thursday\n");
else if(m[d2]==0) printf("Friday\n");
for(int i=1;i<=30;i++) m[i]=0;
}
return 0;
}
F - Stones in the Bucket
j就是将石子移成每一瓶都一样就就可以了,可以想到,先求出平均数,然后用和比平均数大的求差就可以了,注意会爆int
# include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+100;
typedef long long LL;
LL a[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--){
LL n;
LL sum=0;
LL cnt=0;
LL ans=0;
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
if(n==1){
printf("0\n");
}else{
cnt=sum/n;
for(int i=1;i<=n;i++){
if(a[i]>cnt){
ans+=(a[i]-cnt);
}
}
printf("%lld\n",ans);
}
}
return 0;
}
M - Sekiro
就是暴力模拟每一次,然后模拟就可以了,注意如果超过就要跳出来,然后对于向上取整和向下取整最好还是手动模拟,用奇偶分类就可以
# include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,k;
scanf("%d %d",&n,&k);
for(int i=1;i<=k;i++){
if(i>=40) break;
if(n%2){
n=n+1;
n=n/2;
}else{
n=n/2;
}
}
printf("%d\n",n);
}
return 0;
}
第九届福建省大学生程序设计竞赛
A - Uint47 calculator
加法减法记得取余,因为乘法会爆ll,所以用快速乘就可以
#include <iostream>
#include <string>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const LL MODD=1LL<<47;
map<string,LL> MAP;
LL qmul(LL a,LL b,LL m)
{
LL ans=0;
LL k=a;
LL f=1;
if(k<0){ f=-1; k=-k; }
if(b<0){ f*=-1; b=-b; }
while(b){
if(b&1) ans=(ans+k)%m;
k=(k+k)%m;
b>>=1;
}
return ans*f;
}
int main()
{
string name;
LL ans=0;
while(cin>>name){
string a,b;
if(name=="def"){
cin>>a;
cin>>MAP[a];
}else{
cin>>a>>b;
if(name=="add") MAP[a]=(MAP[a]+MAP[b])%MODD;
if(name=="sub") MAP[a]=((MAP[a]-MAP[b])+MODD)%MODD;
if(name=="mul") MAP[a]=qmul(MAP[a],MAP[b],MODD);
if(name=="div") MAP[a]=MAP[a]/MAP[b];
if(name=="mod") MAP[a]=MAP[a]%MAP[b];
}
cout<<a<<" = "<<MAP[a]<<endl;
}
return 0;
}
F - IoU
计算出相交的区域,一般就解决了
计算相交区域代码 (手动画个图就可以理解了,大概就是因为重复的那一段加了两次,然后减去总的长度就可以了)
double x1,y1,x2,y2,x3,y3,x4,y4;
double x[4],y[4];
double s,l,h;
while(cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4)
{
x[0]=x1;x[1]=x2;x[2]=x3;x[3]=x4;
y[0]=y1;y[1]=y2;y[2]=y3;y[3]=y4;
sort(x,x+4);
sort(y,y+4);
l=fabs(x2-x1)+fabs(x4-x3)-(x[3]-x[0]);
h=fabs(y2-y1)+fabs(y4-y3)-(y[3]-y[0]);
s=l*h;
if(l<=0 || h<=0)s=0.00;
printf("%.2f\n",s);
}
AC代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--){
double x1,y1,w1,h1;
double x2,y2,w2,h2;
cin>>x1>>y1>>w1>>h1>>x2>>y2>>w2>>h2;
double xa,ya,xb,yb,xc,yc,xd,yd;
xa=x1,ya=y1,xb=x1+w1,yb=y1+h1,xc=x2,yc=y2,xd=x2+w2,yd=y2+h2;
double x[4],y[4];
double s1,s2,l,h;
x[0]=xa;x[1]=xb;x[2]=xc;x[3]=xd;
y[0]=ya;y[1]=yb;y[2]=yc;y[3]=yd;
/*
for(int i=0;i<4;i++){
printf("%f %f\n",x[i],y[i]);
}*/
sort(x,x+4);
sort(y,y+4);
l=fabs(xb-xa)+fabs(xd-xc)-(x[3]-x[0]);
h=fabs(yb-ya)+fabs(yd-yc)-(y[3]-y[0]);
s1=l*h;
if(l<=0.0 || h<=0.0)s1=0.00;
s2=w1*h1+w2*h2-s1;
double k;
k=s1/s2;
//printf("@@@ %f %f\n",s1,s2);
printf("%.2f\n",k);
}
return 0;
}
向wjmzbmr学习,acm本就是逆天而行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】