题意:给n张牌,n一定为偶数,n/2个人抽两张牌,使得每个人抽的牌的数字之和都相同.题目保证一定有解.输出每个人抽的两张牌的编号.
思路:因为一定有解,按照牌的数字sort一下即可.
#include<bits/stdc++.h>
using namespace std;
pair<int,int>card[105];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&card[i].first);
card[i].second=i+1;
}
sort(card,card+n);
for(int i=0;i<n/2;i++){
printf("%d %d\n",card[i].second,card[n-1-i].second);
}
}
题意:看原题上的Note比较清楚.
思路:将需要消除的row,column记录一下即可,若是未记录的就减1,最后将剩下的row和column数相乘.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int vx[1000005],vy[1000005];
int main(){
int n,m,x,y;
LL r,c;
scanf("%d%d",&n,&m);
r=n,c=n;
while(m--){
scanf("%d%d",&x,&y);
if(!vx[x]&&!vy[y]){
r--;
c--;
}
else if(!vx[x]&&vy[y]){
c--;
}
else if(vx[x]&&!vy[y]){
r--;
}
vx[x]++,vy[y]++;
printf("%I64d\n",r*c);
}
}
题意:给你长度为n的字符串,求含最多不同字母的连续最小子区间.
思路:two-pointer.O(n)的复杂度.
#include<bits/stdc++.h>
using namespace std;
char s[100005];
map<char,int>V;
int main(){
int n,l=0,r=0,sum=0,ans=0x3f3f3f;
scanf("%d",&n);
scanf("%s",s);
for(int i=0;i<n;i++){
if(!V[s[i]]){
sum++;
V[s[i]]++;
}
}
V.clear();
while(l<n){
while(V.size()<sum&&r<n){
V[s[r++]]++;
}
if(V.size()>=sum)ans=min(ans,r-l);
V[s[l]]--;
if(!V[s[l]])V.erase(s[l]);
l++;
}
printf("%d\n",ans);
}
题意:长度为l的一条路,学校太穷,只有一辆车.而且只能载k个人而且每个学生只能做一次车,速度为v2,总共有n个人,步行速度为v1,求所有人走完路所用最短时间.
思路:推公式,一开始误解以为车必须到达目的,所以sample2无法解释.车可以停在路上某一位置,然后在回去接人,再将车开到之前一个人走到的位置,再回去接人.直至所有人都到达目的地.
1.最后一个学生到达目的地的时间和最后一趟车到达目的地的时间相同.
2.先模拟车第一次送人的过程.假设车停在某一位置,距离开始位置为d,然后回去再接人的距离为(v2-v1)/(v2+v1)*d.记为d1
3.根据公式d*ceil(n/k)-d1*(ceil(n/k)-1)=l.因为车前进的距离为d*ceil(n/k),车回去接人的距离为d1*(ceil(n/k)-1).
相减则为路长的距离l.
4.d1用d表示,求出d,那么最后的答案就是d/v2+(l-d)/v1;
#include<bits/stdc++.h>
using namespace std;
int main(){
double n,v1,v2,l,k,t;
scanf("%lf%lf%lf%lf%lf",&n,&l,&v1,&v2,&k);
t=ceil(n*1.0/k);
printf("%.10f\n",l/v2*(v1+v2*(2*t-1))/(v1*(2*t-1)+v2));
}