想写一个游戏挂机插件,需要一直在游戏内长按鼠标左键来开枪,但不影响鼠标去游戏窗口外边干其他事,想问下大家,除了大漠插件,c语言里有没有原生支持此功能的方案,谢谢!
可以试试使用Windows操作系统提供的WinAPI函数SendInput用来模拟鼠标和键盘的输入事件,示例如下:
#include <windows.h>
void simulateMouseClick()
{
INPUT input;
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
SendInput(1, &input, sizeof(INPUT));
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1, &input, sizeof(INPUT));
}
int main()
{
// 模拟鼠标点击事件,这里可以使用循环+延迟
simulateMouseClick();
return 0;
}
输入输出用例:第一行为事件个数,从第二行开始,每行为一个事件的开始时间和结束时间,中间用空格隔开。
5
1 4
1 2
2 3
3 4
3 5
方法一:
求最多有多少个事件同时发生,那我们可以依次把每个时刻(都是整数)发生了多少个事件求出来,找出最大值,即为答案。
如图,先求出t1时刻发生了多少事件,再求t2时刻发生了多少事件,再求t3时刻发生了多少事件,一直求到t4时刻发生了多少事件。
求某一时刻发生了多少事件,需要遍历所有事件,判断事件的起始时间start和结束时间end是否满足:start<=t<end,若满足,则t时刻发生的事件数+1。
时间复杂度度警告!!!这种方法时间复杂度非常高,一共有tmax个时刻,每个时刻遍历一遍所有事件判断该事件在当前时刻是否发生,O(tmax*n)的复杂度。
C++代码:
int main() {
// 处理输入输出
int n;
cin >> n;
vector<vector<int>> vec(n,vector<int> (2)); // 保存每个事件的起始时间和结束时间
int max_en = 0; // 保存最大的时间
for (int i = 0; i < n; ++i) {
scanf("%d%d", &vec[i][0], &vec[i][1]);
max_en = max(max_en, vec[i][1]);
}
// 求每一时刻发生了多少事件
int res = 0;
for (int i = 1; i <= max_en; ++i) {
int cur = 0; // 保存时刻i发生的事件数量
for (const auto &j : vec) {
if (i >= j[0] && i < j[1]) {
++cur; // 如果该事件的起始时间和结束时间包含该时刻i,则事件数+1
}
}
res = max(res, cur); // 更新某时刻发生事件数量的最大值
}
cout << res;
}
方法二:
可以额外建一个长度为tmax的数组,数组的每个元素代表当前时刻发生的事件个数,数组元素全部初始化为0。然后只需要遍历一遍所有事件,每遍历到一个事件,就把数组的该事件的start到end部分元素值+1,表示这段时间又多了一个事件发生。最后数组元素的最大值,就是同时发生最多事件的数量。
时间复杂度警告!!!这种方法时间复杂度仍为O(n*tmax),但每个事件并不是从0~tmax都有值,而是只占了一小段时间,因此最优复杂度低一点,比上一种方法快一点。
C++代码:
int main() {
// 处理输入输出
int n;
cin >> n;
vector<vector<int>> vec(n, vector<int>(2)); // 保存每个事件的起始时间和结束时间
int max_en = 0; // 保存最大的时间
for (int i = 0; i < n; ++i) {
scanf("%d%d", &vec[i][0], &vec[i][1]);
max_en = max(max_en, vec[i][1]);
}
vector<int> v(max_en + 1, 0); // 额外建一个数组,保存每一时刻发生了多少事件
for (const auto &j : vec) {
for (int i = j[0]; i < j[1]; ++i) {
++v[i];
}
}
auto res = max_element(v.begin(), v.end());
cout << *res;
}
方法三:
以上两种方法都比较好理解,但时间复杂度太高,还有别的方法,以后更新。