- C++
8月第二周day01
- @ 2024-8-12 20:17:21
第一题
n l r
if(l/n==r/n) r%n;
else n-1;
第二题
两个操作
1 , 把x改成v
2 , x排序完以后 现在在哪里
x 表示的是目标数组的下标
3 4 长度为3的数组 有4次操作
3 2 1 数组的元素
2 3 2表示 第二个操作 , 查下标为3的值排序后在哪
1 3 2 1表示第一个操作, 把下标为3的值改成2
2 2
2 3
// 1 3 5 4 从小到大
// 1 2 3 4
for (int i = 1; i <= n; i++)
for (int j = i; j >= 2; j--)
if (a[j] < a[j-1]) {
int t = a[j-1];
a[j-1] = a[j];
a[j] = t;
}
第三题
1,一堆地址是够合法的判断 (细心去写)
2,合法的地址 可能是服务器 也可能是客户端 一个服务器能连多个客户端 服务器的地址是唯一的 , 客户可以重复
3,统计服务器的链接个数
输入 是n行 每行两个字符串
输出 n个终端的状态
//暴力直接写
#include <bits/stdc++.h>
using namespace std;
int arr[8100],brr[8100];
int n,q;
//找的位置不是准确的位置
int main(){
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
while(q--){
int c,x,v;
cin>>c;
if(c==1){
cin>>x>>v;
arr[x] = v;
}else{
cin>>x;
//查找下标为x的数排序后所在的位置
for(int i=1;i<=n;i++) brr[i] = arr[i];
sort(brr+1,brr+1+n);
for(int i=1;i<=n;i++){
if(brr[i]==arr[x]){
cout<<i<<endl;
break;
}
}
}
}
return 0;
}
//优化
#include <bits/stdc++.h>
using namespace std;
int arr[8100];
struct node{
int z;
int cnt;
}brr[8100];
int n,q;
bool cmp(node a,node b){
if(a.z<b.z) return 1;
else if(a.z>b.z) return 0;
else return a.cnt<b.cnt;
}
//想办法处理重复查找的问题
int main(){
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
while(q--){
int c,x,v;
cin>>c;
if(c==1){
cin>>x>>v;
arr[x] = v;
}else{
cin>>x;
//查找下标为x的数排序后所在的位置
for(int i=1;i<=n;i++){
brr[i].z = arr[i];
brr[i].cnt = i;
}
sort(brr+1,brr+1+n,cmp);
for(int i=1;i<=n;i++){
if(brr[i].cnt==x){
cout<<i<<endl;
break;
}
}
}
}
return 0;
}
优化查找速度
#include <bits/stdc++.h>
using namespace std;
int arr[8100];
struct node{
int z;
int cnt;
}brr[8100];
int n,q;
bool cmp(node a,node b){
if(a.z<b.z) return 1;
else if(a.z>b.z) return 0;
else return a.cnt<b.cnt;
}
//想办法处理重复查找的问题
int main(){
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>brr[i].z;
brr[i].cnt = i;
}
sort(brr+1,brr+1+n,cmp); // brr[i`] 1~n z有序的 cnt打乱的
for(int i=1;i<=n;i++){
arr[brr[i].cnt] = i; // arr[cnt] = 当前你在brr的位置
}
while(q--){
int c,x,v;
cin>>c;
if(c==1){
cin>>x>>v;//brr.cnt
brr[arr[x]].z = v; //直接定位赋值
//更新位置 brr arr 跟左右比 然后更新
for(int i=n;i>=2;i--){
if(cmp(brr[i],brr[i-1])){
node t = brr[i];
brr[i] = brr[i-1];
brr[i-1] = t;
}
}
for(int i=2;i<=n;i++){
if(cmp(brr[i],brr[i-1])){
node t = brr[i];
brr[i] = brr[i-1];
brr[i-1] = t;
}
}
for(int i=1;i<=n;i++){
arr[brr[i].cnt] = i;
}
}else{
cin>>x;
cout<< arr[x]<<endl;
}
}
return 0;
}
第三题
#include <bits/stdc++.h>
using namespace std;
//三题
int n;
map<string, int > h;
int f(int x){ //返回x的位数
int c = 0; //位数
while(x){
x/=10;
c++;
}
return c ? c : 1;
}
bool check(string s){ //判断ip是否合法
int x = 0,c = 0; //数字 和位数
string tmp;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){ //是数字 拼接
x = x*10+s[i]-'0';
c++;
}else{
if(!c || c>3 || x>255 || f(x)!=c)
return 0;
tmp+= s[i];
x = c = 0;
}
}
return tmp=="...:" && c>0 && c<6 && x<65536 &&f(x)==c;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
string q,ip;
cin>>q>>ip;
if(!check(ip))
cout<<"ERR"<<endl;
else { //判断一下要干嘛 存 查找
cout<<"OK"<<endl;
}
}
return 0;
}
第三题正确代码
#include <bits/stdc++.h>
using namespace std;
int n;
map<string, int> h;
int f(int x) { // 返回数字位数
int c = 0;
for(; x; x /= 10, c++);
return c ? c : 1;
}
bool check(string s) {// 检验 ip 地址是否合法
// 检验 ip 地址中的数字串是否合法以及分隔符是否为 "...:"
string tmp;// 存储分隔符
int x = 0, c = 0;// 数字串对应数值和位数
for(int i = 0; i < s.size(); i++)// 检验数字串是否合法
if(s[i] >= '0' && s[i] <= '9')// 更新数字串
x = x * 10 + s[i] - '0', c++;
else {
if (!c || c > 3 || x > 255 || f(x) != c)// 位数、数值、前导 0 不合法
return 0;
tmp += s[i], x = c = 0;
}
return tmp == "...:" && c > 0 && c < 6 && x < 65536 && f(x) == c;// 检验分隔符和数字串是否合法
}
int main() {
freopen("net.in","r",stdin);
freopen("net.out","w",stdout);
cin >> n;
for(int i = 1; i <= n; i++) {
string type, ip;
cin >> type >> ip;
if(!check(ip))// ip 地址不合法
cout << "ERR" << endl;
else if(type == "Server")
if(h.find(ip) == h.end()) {// 不存在 ip 地址相同的服务器
cout << "OK" << endl;
h[ip] = i;
}
else// 存在 ip 地址相同的服务器
cout << "FAIL" << endl;
else {
if(h.find(ip) == h.end())// 不存在 ip 地址相同的服务器
cout << "FAIL" << endl;
else// 存在 ip 地址相同的服务器
cout << h[ip] << endl;
}
}
return 0;
}
0 条评论
目前还没有评论...