相反数
思路
数组模拟哈希
实现
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N];
int n,ans;
int main()
{
int t;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&t);
a[abs(t)]++;
}
for(int i=0;i<N;i++)
{
if(a[i]==2)ans++;
}
cout<<ans;
}
窗口
思路
简单模拟
实现
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct node
{
int x1,y1;
int x2,y2;
int now;
}nodes[15];
bool check(int x,int y,int i)
{
if(x<=nodes[i].x2 && x>=nodes[i].x1 && y<=nodes[i].y2 && y>=nodes[i].y1) return 1;
return 0;
}
int main()
{
cin>>n>>m;
for(int i=n-1;i>=0;i--)
{
scanf("%d %d %d %d\n",&nodes[i].x1,&nodes[i].y1,&nodes[i].x2,&nodes[i].y2);
nodes[i].now = n-i;
}
int x,y;
for(int k=0;k<m;k++)
{
scanf("%d %d\n",&x,&y);
int i;
for(i=0;i<n;i++)
{
if(check(x,y,i))
{
cout<<nodes[i].now<<endl;
break;
}
}
if(i==n)
{
cout<<"IGNORED"<<endl;
continue;
}
node tmp = nodes[i];
for(int j = i;j>0;j--)
nodes[j] = nodes[j-1];
nodes[0] = tmp;
}
}
命令行选项
思路
简单模拟
需要按照字典序输出、无重复且值相同时后面的会覆盖前面的,用map较简单
实现
#include <bits/stdc++.h>
using namespace std;
string a;
int n;
int canshu[30];
int main()
{
cin>>a;
for(int i=0;i<a.size();i++)
{
if(a[i]!=':')
{
if(a[i+1]==':') canshu[a[i]-'a'] = 2;
else canshu[a[i]-'a'] = 1;
}
}
cin>>n;
getchar();
string t,s;
vector<string>vs;
map<char,string> output;
for(int i=0;i<n;i++)
{
output.clear();
vs.clear();
getline(cin, t);
stringstream ssin(t);
while (ssin >> s) {
vs.push_back(s);
}
for(int j=1;j<vs.size();j++)
{
if (vs[j][0] != '-' || vs[j][1] < 'a' || vs[j][1]>'z' || vs[j].size() != 2) break;
char cc = vs[j][1];
if(canshu[cc-'a']==0) break;
else if(canshu[cc-'a']==1)
{
output[cc] = "*";
}
else if(canshu[cc-'a']==2)
{
if(j+1<vs.size())
{
output[cc] = vs[j+1];
j++;
}
else break;
}
}
cout<<"Case "<<i+1<<":";
for(auto tmp:output)
{
if(tmp.second=="*") cout<<" -"<<tmp.first;
else cout<<" -"<<tmp.first<<" "<<tmp.second;
}
cout<<endl;
}
}
无线网络
思路
读入坐标后建图
d
i
s
t
[
i
]
[
j
]
dist[i][j]
dist[i][j]表示从第一个点到第
i
i
i个点,经过不超过
k
k
k个新增加的路由器时的最短路径
实现
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,m,k,r;
const int N = 210;
struct node
{
int x,y;
}nodes[N];
vector<int> a[N];
int dist[N][N];
bool check(int a,int b)
{
LL s1=(LL)(nodes[a].x-nodes[b].x)*(nodes[a].x-nodes[b].x)+(LL)(nodes[a].y-nodes[b].y)*(nodes[a].y-nodes[b].y); //乘积很大,开LL
return s1<=(LL)r*r;
}
int bfs()
{
memset(dist,0x3f,sizeof dist);
queue<pair<int,int>> q;
q.push({1,0});
dist[1][0] = 0;
while(q.size())
{
auto t = q.front();
q.pop();
int num = t.first;
for(int i=0;i<a[num].size();i++)
{
int cnt = t.second;
int j = a[num][i];
if(j>n) cnt++;
if(cnt<=k)
{
if(dist[j][cnt]>dist[num][t.second]+1)
{
dist[j][cnt]=dist[num][t.second]+1;
q.push({j,cnt});
}
}
}
}
int ans=N;
for(int i=1;i<=k;i++)
{
ans=min(ans,dist[2][i]);
//cout<<i<<" "<<dist[2][i]<<endl;
}
return ans-1;
}
int main()
{
cin>>n>>m>>k>>r;
for(int i=1;i<=n+m;i++)
{
scanf("%d %d\n",&nodes[i].x,&nodes[i].y);
}
for(int i=1;i<=n+m;i++)
{
for(int j=i+1;j<=n+m;j++)
{
if(check(i,j))
{
// cout<<"i : "<<i<<" j: "<<j<<endl;
a[i].push_back(j);
a[j].push_back(i);
}
}
}
cout<<bfs()<<endl;
}
任务调度
思路
–