題意:給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));
}