数字计数
题意:求最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差。
思路:题目的数据量比较小,直接用一个sort排好序后进行求解即可,注意去重即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100010;
int a[1000];
int main(){
int n;
cin>>n;
map<int,int> mp;
int k=0;
for(int i=0;i<n;i++){
int x;
cin>>x;
mp[x]++;
if(mp[x]==1){
a[k++]=x;
}
}
sort(a,a+k);
cout<<a[k-1]-a[k-2]<<" ";
cout<<a[k-1]-a[1]<<" ";
cout<<a[k-2]-a[1]<<" ";
cout<<a[k-2]-a[0]<<endl;
return 0;
}数颜色
题意:给你一个序列,长度为n,求这个序列的所有的子区间中不同的数的个数之和。
思路:我们发现,我们的长度比较小,故可以直接用暴力求解,我们用两重循环来枚举这个序列所有的子区间,然后对于每个子区间,我们直接用set来存储数字,最后加上set的大小即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100010;
ll a[1010];
map<int,int> mp;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll ans=0;
for(int i=1;i<=n;i++){
set<int>st;
for(int j=i;j<=n;j++){
st.insert(a[j]);
ans+=st.size();
}
}
cout<<ans<<endl;
return 0;
}智斗恶龙
题意:给你一个矩阵,规定在某个位置开始移动,移动的距离最长为d,在可以移动的范围内,选择至少x个宝藏,然后使得这x个的最大和最小的差值最小。注意不能经过陷阱。
思路:一个很裸的bfs,我们先利用bfs来求出我们一共可以获得几种不同的宝藏,然后我们就可以对这些宝藏进行讨论了。其次是要注意几个点:1、可能一开始就在陷阱里面,这是我们要看x的具体值进行分析。2、假设我们求到的宝藏的个数为n>=x,我们要对这n个宝藏进行讨论,我们要维护一个区间长度为x的两端的差值。3、这个宝藏的表示的数可能十分大,我们可以用一个set进行去重和离散化即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,dx,dy,d,x;
ll a[1010][1010];
int X[]={0,0,1,-1},Y[]={1,-1,0,0};
bool inq[1010][1010];
struct node{
int x,y;
int dis;
}Node;
bool judge(int x,int y){
if(x<1||y<1||x>n||y>m) return false;
if(a[x][y]==-1) return false;
if(inq[x][y]) return false;
return true;
}
void solve(){
set<ll> st;
vector<ll> v;
memset(inq,false,sizeof(inq));
cin>>n>>m>>dx>>dy>>d>>x;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
if(a[dx][dy]==-1){
if(x>0) cout<<"no"<<endl;
else cout<<"0"<<endl;
return;
}
Node={dx,dy,0};
if(a[dx][dy]>0){
st.insert(a[dx][dy]);
v.push_back(a[dx][dy]);
}
queue<node> q;
q.push(Node);
inq[dx][dy]=true;
while(q.size()){
node top=q.front();
q.pop();
for(int i=0;i<4;i++){
int newx=X[i]+top.x,newy=Y[i]+top.y;
if(judge(newx,newy)&&top.dis<d){
if(a[newx][newy]>0&&st.find(a[newx][newy])==st.end()){
// cout<<a[newx][newy]<<endl;
st.insert(a[newx][newy]);
v.push_back(a[newx][newy]);
}
Node={newx,newy,top.dis+1};
inq[newx][newy]=true;
q.push(Node);
}
}
}
if(st.size()<x) cout<<"no"<<endl;
else{
int len=v.size();
ll ans=1e18;
sort(v.begin(),v.end());
for(int i=x-1;i<len;i++){
ll tmp=v[i]-v[i-x+1];
ans=min(ans,tmp);
}
cout<<ans<<endl;
}
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}能量水晶
由于对背包问题还不是太了解,先放着,也许一个礼拜后会回来补。ORZ

京公网安备 11010502036488号