上周周赛
这道题我刚看到的时候以为它想让我用高精度QAQ。然后好不容易把高精度写出来了意识到它范围超了似乎要用动态数组QAQ,然后我改了半天越改越错。。。遂放弃QAQ
事实上它的正解是同余定理QAQ
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b,ans=1;
cin>>a>>b;
for(int i=1;i<=b;i++)
ans=(ans*(a%7))%7;
if(ans==1) printf("Monday");
if(ans==2) printf("Tuesday");
if(ans==3) printf("Wednesday");
if(ans==4) printf("Thursday");
if(ans==5) printf("Friday");
if(ans==6) printf("Saturday");
if(ans==0) printf("Sunday");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
bool runnian(int i)
{
if((i%4==0 && i%100!=0)||i%400==0) return 1;
else return 0;
}
int yue(int y,int m)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) return 31;
else if(m==4||m==6||m==9||m==11) return 30;
else
{
if(runnian(y)==1) return 29;
else return 28;
}
}
int main()
{
int sy,sm,sd;
int ey,em,ed;
int ans=0;
cin>>sy>>sm>>sd;
cin>>ey>>em>>ed;
for(int i=sy;i<ey;i++)
{
if(runnian(i)==1) ans+=366;
else ans+=365;
}
ans+=ed;
ans-=sd;
for(int i=1;i<em;i++)
{
ans+=yue(ey,i);
}
for(int i=1;i<sm;i++)
{
ans-=yue(sy,i);
}
cout<<ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const long long N=9999999;
long long a[N]={},d[N]={},sum[N]={},l[N]={};
int main()
{
long long n,min=N,q;
cin>>n;
for(long long i=0;i<n;i++){
cin>>a[i]>>d[i];
}
long long L=0;
for(long long i=0;i<n;i++){
L+=d[i];
}
//cout<<L<<endl;
for(long long i=0;i<n;i++){
l[i]=l[i-1]+d[i-1];
}
for(long long i=0;i<n;i++){
long long s=0;
for(long long j=0;j<n;j++){
long long p=abs(l[i]-l[j]);
s=p<(L-p)?p:L-p;
//cout<<"^"<<s<<" ";
sum[i]+=a[j]*s;
}
//cout<<"@"<<sum[i]<<" ";
}
for(long long i=0;i<n;i++){
if(sum[i]<min){
min=sum[i];
q=i;
}
}
cout<<q<<","<<min;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b,n;
cin>>a>>b>>n;
int sum=a+b;
for(int i=1;i<=n;i++)
sum=sum*3-a-b;
printf("%d",sum);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[1002][1002]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
int x1,y1,x2,y2;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0){
x1=i;
y1=j;
break;
}
}
if(x1!=0) break;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0){
x2=i;
y2=j;
}
}
}
int ans=(x2-x1-1)*(y2-y1-1);
cout<<ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
char s[1020000];
void sai(int x,int y)
{
int n=0,m=0;
for(int i=0;i<y;i++)
{
if(s[i]=='W') n++;
if(s[i]=='L') m++;
if((n>=x||m>=x)&&abs(m-n)>=2)
{
cout<<n<<":"<<m<<endl;
n=0;m=0;
}
}
cout<<n<<":"<<m<<endl;
}
int main()
{
char a;
int n=0;
while(cin>>a&&a!='E')
s[n++]=a;
sai(11,n);
printf("\n");
sai(21,n);
return 0;
}
关于前缀和和差分的练习题
题看起来好麻烦QAQ
事实上可以通过计算每一站的重复次数来判断这一站要不要买卡,最后再将各个站所花费的费用加起来就好QWQ
#include <bits/stdc++.h>
using namespace std;
const long long N=1e5+21;
long long A[N]={},B[N]={},C[N]={},M[N]={};
long long ci[N]={},c[N]={},f[N]={};
int main()
{
long long n,m,fee=0;
cin>>n>>m;
for(long long i=1;i<=m;i++)
cin>>M[i];
for(long long i=1;i<=n-1;i++)
cin>>A[i]>>B[i]>>C[i];
for(long long i=1;i<=m-1;i++){
c[min(M[i],M[i+1])]++;
c[max(M[i],M[i+1])]--;
}
for(long long i=1;i<=n-1;i++){
ci[i]=ci[i-1]+c[i];//先使用差分算每一站的次数;
}
for(long long i=1;i<=n-1;i++){
if(A[i]*ci[i]>B[i]*ci[i]+C[i]) f[i]=B[i]*ci[i]+C[i];//比较要不要办卡
else f[i]=A[i]*ci[i];
}
for(int i=1;i<=n-1;i++)
fee+=f[i];//加起来QWQ
cout<<fee;
return 0;
}
来自AI的翻译QAQ(让我们谢谢AI QAQ
这道题感觉和A的解法好像。。。
先各自找到身高最高的猩猩以及重复次数最多的方块,然后相乘再相加QAQ
#include <bits/stdc++.h>
using namespace std;
const long long N=2e5+10;
long long a[N]={0},b1[N]={0};
bool cmp(long long A,long long B)//sort函数要用;
{
return A>B;
}
int main()
{
long long t;
cin>>t;
for(long long i=1;i<=t;i++)
{
long long n,m,k,ans=0;
cin>>n>>m>>k;
long long w;
cin>>w;
long long c[n+2][m+2]={};//
for(long long j=1;j<=N;j++){//每次运算完要重新把他们都变成0;
a[j]=0;b1[j]=0;
}
for(long long j=1;j<=n-k+1;j++){
for(long long jj=1;jj<=m-k+1;jj++){
c[j][jj]=0;
}
}
for(long long j=1;j<=w;j++)
cin>>a[j];
for(long long j=1;j<=n-k+1;j++){
for(long long jj=1;jj<=m-k+1;jj++){
c[j][jj]++;
c[j+k][jj]--;
c[j][jj+k]--;
c[j+k][jj+k]++;
}
}
for(long long j=1;j<=n;j++){
for(long long jj=1;jj<=m;jj++){
c[j][jj]+=c[j-1][jj]+c[j][jj-1]-c[j-1][jj-1];
}
}
long long f=1;
for(long long j=1;j<=n;j++){
for(long long jj=1;jj<=m;jj++){
b1[f++]=c[j][jj];//二维差分计算每个格子出现的次数;
}
}
sort(b1+1,b1+f+1,cmp);
sort(a+1,a+w+1,cmp);
for(long long j=1;j<=w;j++){
ans+=a[j]*b1[j];
}
cout<<ans<<endl;
}
return 0;
}
不过还有一点需要注意一下QAQ:
数据范围是到2e5,如果直接把数组c设成c[N][N]的话会变成4e10,就超了(一般最多是4e8(善良的石宇学长告诉我的QWQ))
依然是来自AI的翻译QAQ:
这道题的思路也好有趣QWQ
善良的石宇学长讲完之后我似乎懂了他为什么要这么干。。。。。。
但让我说我是绝对说不出来的。。。。。。
有一种十分奇怪的美感。。。。。。(不是
#include <bits/stdc++.h>
using namespace std;
const long long N=1e5+12;
long long a[N]={0},c[N]={0};
int main()
{
long long t;
cin>>t;
for(long long i=1;i<=t;i++)
{
long long n,d,k;
cin>>n>>d>>k;
for(long long i=1;i<=n;i++){
a[i]=0;
c[i]=0;
}
for(long long j=1;j<=k;j++){
long long li,ri;
cin>>li>>ri;
c[max(1LL,li-d+1)]++;
c[ri+1]--;
}
for(long long j=1;j<=n;j++){
a[j]=a[j-1]+c[j];
}
long long max=0,ans1=0;
for(long long j=1;j<=n-d+1;j++){
if(a[j]>max){
max=a[j];
ans1=j;
}
}
long long min=1e5+12,ans2=0;
for(long long j=1;j<=n-d+1;j++){
if(a[j]<min){
min=a[j];
ans2=j;
}
}
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}