AcWing1210 连号区间数
第二行是n个不同的数
//AcWing1210 连号区间数
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10005;
int a[N];
int main()
{
int n,res=0,max,min;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
max=a[i],min=a[i];
for(int j=i;j<n;j++)//优化 在连号区间内,最大值最小值之差等于区间b-a
{
if(a[j]<min) min=a[j];
if(a[j]>max) max=a[j];
if((max-min)==(j-i)) res++;
}
}
printf("%d",res);
return 0;
}
AcWing1236 递增三元组
nlongn 枚举b,a和c的取值独立,可以用乘法。对于每一个bj,求a中有多少个比它小,在c中有多少个大于它。怎么用前缀和做?开一个数组cnt[i]表示在a中i这个值出现多少次(循环一次)然后再把cnt变成前缀和,cnt[i]就表示a数组中从0到i出现多少次,就相当于a中有多少个数小于b
//AcWing1236 递增三元组
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100005;
int a[N],b[N],c[N],cnta[N],cntc[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
a[i]++;
cnta[a[i]]++;
}
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
b[i]++;
}
for(int i=0;i<n;i++)
{
scanf("%d",&c[i]);
c[i]++;
cntc[c[i]]++;
}
for(int i=1;i<=N;i++)//求前缀和
{
cnta[i]+=cnta[i-1];
cntc[i]+=cntc[i-1];
}
long long sum=0,aa,cc;
for(int i=0;i<n;i++)
{
aa=cnta[b[i]-1];
cc=cntc[N-1]-cntc[b[i]];
sum+=aa*cc;
}
printf("%lld",sum);
return 0;
}
AcWing1245 特别数的和
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
bool check(int x)
{
int t;
while(x)
{
t=x%10;
x=x/10;
if(t==2||t==0||t==1||t==9)
{
return true;
}
}
return false;
}
int main()
{
int n,t;
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++)
{
if(check(i))
sum+=i;
}
printf("%lld",sum);
return 0;
}
AcWing1204 错误票据
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10005;
int a[N];
int main()
{
int n;
cin>>n;
int i=0;
while(scanf("%d",&a[i])!=EOF)
{
i++;
}
// for(int j=0;j<i;j++)
// {
// cout<<a[j]<<endl;
// }
sort(a,a+i);
// for(int j=0;j<i;j++)
// {
// cout<<a[j]<<endl;
// }
int aa,bb;
for(int j=0;j<i;j++)
{
if(a[j]!=a[j+1]-1)
{
if(a[j]==a[j+1])
{
bb=a[j];
}
if(a[j]==a[j+1]-2)
{
aa=a[j]+1;
}
}
}
printf("%d %d",aa,bb);
return 0;
}
AcWing466 回文日期
闰年判断:400年闰或者4年一闰100年不闰
if(year%400==0||(year%4==0&&year%100!=0))
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool check(int y1,int m1,int d1)
{
int a[8];
a[0]=y1/1000;
y1=y1%1000;
a[1]=y1/100;
y1=y1%100;
a[2]=y1/10;
a[3]=y1%10;
a[4]=m1/10;
a[5]=m1%10;
a[6]=d1/10;
a[7]=d1%10;
//cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<endl;
if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4])
{
//cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<endl;
return true;
}
else return false;
}
int main()
{
char f[8],l[8];
cin>>f>>l;
int y1=(f[0]-48)*1000+(f[1]-48)*100+(f[2]-48)*10+(f[3]-48),m1=(f[4]-48)*10+(f[5]-48),d1=(f[6]-48)*10+(f[7]-48);
int y2=(l[0]-48)*1000+(l[1]-48)*100+(l[2]-48)*10+(l[3]-48),m2=(l[4]-48)*10+(l[5]-48),d2=(l[6]-48)*10+(l[7]-48);
int sum=0;
while(y1!=y2||m1!=m2||d1!=d2)
{
if(m1==1||m1==3||m1==5||m1==7||m1==8||m1==10||m1==12)
{
if(d1==31)
{
d1=1;
if(m1==12)
{
m1=1;
y1++;
}
else m1++;
}
else
d1++;
}
else if(m1==4||m1==6||m1==9||m1==11)
{
if(d1==30)
{
d1=1;
m1++;
}
else
d1++;
}
else if(m1==2)
{
//闰年
if((y1%400==0)||(y1%4==0&&y1%100!=0))
{
if(d1==29)
{
d1=1;
m1++;
}
else
d1++;
}
else
{
if(d1==28)
{
d1=1;
m1++;
}
else
d1++;
}
}
//cout<<y1<<m1<<d1<<endl;
//判回文
if(check(y1,m1,d1))
{
sum++;
//cout<<y1<<m1<<d1<<endl;
}
}
if(check(y1,m1,d1))
{
sum++;
//cout<<y1<<m1<<d1<<endl;
}
printf("%d",sum);
return 0;
}
AcWing1219 移动距离
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int w,m,n;
cin>>w>>m>>n;
int sum=0;
int maxx=max(m,n);
int minn=min(m,n);
//cout<<maxx<<minn<<endl;
if(((maxx-1)/w)==((minn-1)/w)) sum+=(maxx-minn); //在同一行
else//不同行
{
if(((maxx-1)/w)%2==1)
{
maxx=((maxx-1)/w)*w+(w-(maxx-1)%w);
}
if(((minn-1)/w)%2==1)
{
minn=((minn-1)/w)*w+(w-(minn-1)%w);
}//换到正确地方
//cout<<maxx<<'*'<<minn<<endl;
sum+=(maxx-1)/w-(minn-1)/w;
sum+=abs((maxx-sum*w)-minn);
}
cout<<sum;
return 0;
}
AcWing1229 日期问题
要判断输出的日期符不符合情况,一个月中不可能出现0号
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
bool check(int plan3)//判断是不是一个正确的日期
{
int year=plan3/10000;
int mouth=(plan3%10000)/100;
int day=plan3%100;
if(mouth==1||mouth==3||mouth==5||mouth==7||mouth==8||mouth==10||mouth==12)
{
if(day>=1&&day<=31) return true;
}
else if(mouth==4||mouth==6||mouth==9||mouth==11)
{
if(day>=1&&day<=30) return true;
}
else if(mouth==2)
{
if(year%400==0||(year%4==0&&year%100!=0))
{
if(day>=1&&day<=29) return true;
}
else
{
if(day>=1&&day<=28) return true;
}
}
return false;
}
int main()
{
char ch[8];
cin>>ch;
int a=(ch[0]-48)*10+(ch[1]-48);
int b=(ch[3]-48)*10+(ch[4]-48);
int c=(ch[6]-48)*10+(ch[7]-48);
int plan1,plan2,plan3;
//从小到大
if(a>=60)
{
plan1=19000000+a*10000+b*100+c;
if(c>=60)
{
plan2=19000000+c*10000+a*100+b;
plan3=19000000+c*10000+b*100+a;
}
else
{
plan2=20000000+c*10000+a*100+b;
plan3=20000000+c*10000+b*100+a;
}
}
else
{
plan1=20000000+a*10000+b*100+c;
if(c>=60)
{
plan2=19000000+c*10000+a*100+b;
plan3=19000000+c*10000+b*100+a;
}
else
{
plan2=20000000+c*10000+a*100+b;
plan3=20000000+c*10000+b*100+a;
}
}
int t;
//按照plan1>plan2>plan3的顺序来
if(plan1<plan2) {
t=plan1;plan1=plan2;plan2=t;
}
if(plan1<plan3) {
t=plan1;plan1=plan3;plan3=t;
}
if(plan2<plan3) {
t=plan2;plan2=plan3;plan3=t;
}//加一个check函数
if(check(plan3))
printf("%d-%02d-%02d\n",plan3/10000,(plan3%10000)/100,(plan3%100));
if((plan2!=plan3)&&check(plan2))
printf("%d-%02d-%02d\n",plan2/10000,(plan2%10000)/100,(plan2%100));
if((plan1!=plan2)&&check(plan1))
printf("%d-%02d-%02d\n",plan1/10000,(plan1%10000)/100,(plan1%100));
return 0;
}
AcWing1231 航班时间
主要是如何输出?如何转化?getline(cin,line);的用法,sscanf(line.c_str()," ",&***);的用法
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int get_second(int h,int m,int s)
{
return h*3600+m*60+s;
}
int get_time()
{
string line;
getline(cin,line);//读入一整行
if(line.back()!=')') line+=" (+0)";//统一格式
int h1,m1,s1,h2,m2,s2,d;
sscanf(line.c_str(),"%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
return get_second(h2,m2,s2)-get_second(h1,m1,s1)+d*24*3600;//转化成秒数
}
int main()
{
int t;
scanf("%d",&t);
string line;
getline(cin,line);//吃掉t后边的换行符
while(t--)
{
int total=(get_time()+get_time())/2;
int hour=total/3600;
int minute=total%3600/60;
int second=total%60;
printf("%02d:%02d:%02d\n",hour,minute,second);
}
return 0;
}
AcWing1241 外卖店优先级
将所以订单按照时间顺序排序。对每一个订单,同一时刻,每一个店可能有很多订单,每次处理一批相同的订单。
定义一些全局数组:score[i],第i个店铺当前的优先级。last[i],表示第i个店铺上一次有订单的时刻,s[i]表示第i个店铺当前是否处于优先缓存中。
score[id]-=t-last[id]-1,if(score[id]<=3) s[id]=false;t时刻之前
t时刻,score[id]+=2*cnt;f(score[id]>5) s[id]=true;
最后再枚举一下所有店铺,看last到t之间的情况。for(int i;i<=n;i++) if(last[id]<t)确实没有卖 score[id]-=t-last[id] 再if判断用不用变false
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=100005;
int score[N],last[N];
bool st[N];
int n,m,T;
PII order[N];
int main()
{
cin>>n>>m>>T;
for(int i=0;i<m;i++)
scanf("%d%d",&order[i].x,&order[i].y);
sort(order,order+m);//先按照第一关键字排序,第一关键字相同再比较第二个关键字
for(int i=0;i<m;)
{
int j=i;
while(i<m&&order[j]==order[i]) j++;
int t=order[i].x,id=order[i].y,cnt=j-i;
i=j;
score[id]-=t-last[id]-1;
if(score[id]<0) score[id]=0;
if(score[id]<=3) st[id]=false;
score[id]+=2*cnt;
if(score[id]>5) st[id]=true;
last[id]=t;
}
for(int i=1;i<=n;i++)
{
if(last[i]<T)
{
score[i]-=T-last[i];
if(score[i]<=3) st[i]=false;
}
}
int res=0;
for(int i=1;i<=n;i++)
{
//if(st[i]) res++;
res+=st[i];
}
cout<<res;
return 0;
}