• 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 条评论

目前还没有评论...