A
语法题,可以自定义函数cmp,或者[重载运算符](https://www.cnblogs.com/ssfzmfy/p/13175332.html) 就可以做到
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
struct node
{
int year,month,day;
bool operator<(const node& b)const
{
if(year!=b.year)return year<b.year;
else if(month!=b.month)return month<b.month;
else if(day!=b.day)return day<b.day;
}
}nodes[N];
char op;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>nodes[i].month>>op>>nodes[i].day>>op>>nodes[i].year;
sort(nodes,nodes+n);
for(int i=0;i<n;i++)
cout<<setw(2)<<setfill('0')<<nodes[i].month<<'/'<<setw(2)<<setfill('0')<<nodes[i].day<<'/'<<nodes[i].year<<endl;
return 0;
}
B(答案题解)
WA好几遍,没特判,直接找答案看了
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
int sch[100010],stu[100010];
int main(){
cin>>m>>n;
int ans = 0;
for(int i=0;i<m;i++)
scanf("%d",&sch[i]);
for(int i=0;i<n;i++)
scanf("%d",&stu[i]);
sort(sch,sch+m);
int k=0;
while(k<n)
{
int l = 0, r = m-1 ;
int sc=1000000;
while(l<=r)
{
int mid = (l+r)/2;
if(sch[mid]==stu[k])
{
sc = 0;
break;
}
else if(sch[mid] < stu[k])
{
sc = min(sc,abs(sch[mid]-stu[k]));
l = mid +1;
}else if(sch[mid] > stu[k])
{
sc = min(sc,abs(sch[mid]-stu[k]));
r = mid - 1;
}
}
ans += sc;
k++;
}
cout<<ans;
return 0;
}
C
答案解析
更类似于背包问题,第i选与不选
类似于图论,建立超级源点0(也就是后面的条件!j),我们不知道哪一个是起点,
所以j=0;j<i我们遍历一遍,每一个点都可以和0相连接,并且向后滚动到n,dp[n]取的就是max
#include<bits/stdc++.h>
using namespace std;
const int N=20010;
int dp[N],m[N],p[N],ans[N];
int n,k;
int main()
{
int t;
cin>>t;
int pos=0;
while(t--)
{
pos++;
memset(dp,0,sizeof dp);
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>m[i];
for(int i=1;i<=n;i++)
cin>>p[i];
dp[1]=p[1];
for(int i=2;i<=n;i++)
{
for(int j=0;j<i;j++)//因为这里如果不选m[1],那么就要考虑m[2]
if((m[i]-m[j]>k)||(!j))//答案这里的做法很妙
dp[i]=max(dp[i],dp[j]+p[i]);//i=2,j=0;max(dp[2],dp[0]+p[2])dp[2]=p[2];
//前提m[2]-m[1]>k //i=2,j=1;max(dp[2],dp[1]+p[2])dp[2]=p[2]+p[1];
}
cout<<dp[n]<<endl;
}
return 0;
}