1.P1199 [NOIP2010 普及组] 三国游戏
思路:找第二大中最大的,因为一定拿不到最大的,但一定拿得到第二大的,第一步拿的最大的之后按照计算机的决策作为后手那么计算机也只能拿第二大的拿不到最大的。
代码:
#include<bits/stdc++.h>
using namespace std;
long long dui[1000][1000],max1[1000],max2[1000],n;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=n-i;j++){
int a;
cin>>a;
dui[i][j+i]=dui[j+i][i]=a;
}
}
for(int i=1;i<=n;i++){
max1[i]=0;
max2[i]=0;
for(int j=1;j<=n;j++){
//cout<<dui[i][j]<<" ";
if(dui[i][j]>max2[i])swap(max2[i],dui[i][j]);
if(max2[i]>max1[i])swap(max1[i],max2[i]);
}
//cout<<endl;
}
sort(max2+1,max2+n+1,cmp);
cout<<"1"<<endl<<max2[1];
return 0;
}
2.P1007 独木桥
思路:最重要的就是每个士兵再碰头后往回走就相当于相对穿过。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,l,ans1=0,ans2=0;
cin>>l>>n;
for(int i=1;i<=n;i++){
int temp;
cin>>temp;
ans1=max(ans1,min(temp,l-temp+1));
ans2=max(ans2,max(temp,l-temp+1));
}
cout<<ans1<<" "<<ans2;
return 0;
}
3.P1223 排队接水
思路:简单贪心。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct EVA{
int zhi,id;
};
EVA a[100010];
bool cmp(EVA a,EVA b){
return a.zhi<b.zhi;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i].zhi,a[i].id=i;
sort(a+1,a+1+n,cmp);
double ans=0;
int js=0;
for(int i=1;i<=n;i++)cout<<a[i].id<<" ";
cout<<endl;
for(int i=1;i<=n-1;i++){
js+=a[i].zhi;
ans+=js;
}
cout<<fixed<<setprecision(2)<<(ans/n);
return 0;
}
4.P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
思路:用优先队列维护每次取其中最小的2个进行合并将结果进入答案。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000010];
priority_queue <int,vector<int>,greater<int> > q;
int ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],q.push(a[i]);
for(int i=1;i<=n-1;i++){
int A=q.top();q.pop();
int B=q.top();q.pop();
ans+=A+B;
q.push(A+B);
}
cout<<ans;
return 0;
}