全部评论
图我收下了,谢谢楼主
#include<iostream> #include<vector> using namespace std; //此题有一个要点,就是只要找到了某个区间xor为0,那么后面的数据就跟 //前面的没有关系了。因为区间不能重叠 int main() { int n; cin >> n; vector<int> input(n, 0); for (int i = 0; i < n; i++) cin >> input.at(i); //数据输入 int k = 0; vector<int> num; //用于记录当前所有的可能值 for (int i = 0; i < n; i++) { if (input.at(i) == 0) { k += 1; num.clear(); continue; // 跟样例一个道理,0 就直接是0。。。。 } if (input.at(i)>0) { int flag = 0; for (int j = 0; j < num.size(); j++) { num.at(j) = num.at(j) ^ input.at(i); if (num.at(j) == 0) { flag = 1; k += 1; num.clear(); } } //此处我举个例子,比如找第一个区间,现在循环到了第五位,有几种情况? // input.at(0) ^ input.at(1) ^ input.at(2) ^ input.at(3) ^ input.at(4) // input.at(1) ^ input.at(2) ^ input.at(3) ^ input.at(4) // input.at(2) ^ input.at(3) ^ input.at(4) // input.at(3) ^ input.at(4) // input.at(4) // 这样得到5个数字。来了第6个数,分别于他们xor,发现哪个结果是0,就找 // 到本个区间了,然后将记录清空,继续下一个 if (flag == 0) num.push_back(input.at(i)); } } cout << k << endl; return 0; }
只过了30%
还有其他楼里求答案的,真不知道什么心态。
强行暴力,居然ac了,复杂度没啥限制
看不懂题目 很伤
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
/**
* @author Cherish
* @version 1.0
* @date 2017/9/10 15:59
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n < 1) {
return;
}
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
for (int i = 0; i < n; ) {
int tmp = arr[i];
if (tmp == 0) {// 自成区间
treeMap.put(i, i);
i++;
continue;
}
i++;
for (int j = i; j < n; j++) {
tmp = tmp ^ arr[j];
if (tmp == 0) {
treeMap.put(j, i);// i,j 成区间 做成 (j , i) 为了做活动选取
i = j + 1;
break;
}
}
}
// 最多活动选取
int len = 0;
int tmpJ = -1;
for (Map.Entry<Integer, Integer> entry : treeMap.entrySet()) {
Integer j = entry.getKey();
Integer i = entry.getValue();
if (i > tmpJ) {
len++;
tmpJ = j;
}
}
System.out.println(len);
}
}
50%
话说结果是以提交的最高正确程度为准还是以最后一次提交为准啊
典型的动态规划,不过正确性待证明。
int main() {
int n;
while(cin >> n)
{
vector<int> v;
for(int i=0;i<n;i++)
{
int tmp;
cin>>tmp;
v.push_back(tmp);
}
int c=0;
for(int i=0;i<n;i++)
{
if(v[i]==0)
c++;
if(i+1<n&&v[i]<=v[i+1])
{
int tmp = v[i]^v[i+1];
//v[i]^v[i+1];
if(tmp==0)
{
c++;
i++;
}
else
{
int k=i+1;
while(k++)
{
if(k==n)
break;
if(v[k-1]<=v[k])
{
tmp = tmp^v[k];
if(tmp==0)
{
c++;
i=k;
break;
}
}
}
}
}
}
cout<<c<<endl;
}
return 0;
} 30% 求指点哪错了
怎么改只有百分之三十 心碎
纯贪心,过40%
package 滴滴;
import java.util.Scanner;
public class Demo1_非空区间 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
System.out.println(fun(arr));
}
private static int fun(int[] arr) {
int count = 0;
int xor = 0;
int pre = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == 0){
count++;
xor = 0;
pre = i;
continue;
}else{
xor = xor ^ arr[i];
if(xor == 0){
count++;
pre = i;
xor = 0;
}else{//否则,从后往前求 异或
int newXor = 0;
for (int j = i; j > pre; j--) {
newXor = newXor^arr[j];
if(newXor == 0){
count++;
pre = i;
xor = 0;
j = i+1;
}
}
}
}
}
return count;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
long N=scanner.nextLong();
long num=0;
long pre=-1;
for(long i=0;i<N;i++){
long temp=scanner.nextLong();
if(temp==0){
num++;
}
else if(pre!=-1&&temp==pre){
num++;
pre=-1;
}
else{
pre=temp;
}
}
System.out.println(num);
scanner.close();
}
}
求指导一下
过了70。。。
🤣
相关推荐
01-05 19:07
北京大学 算法工程师 点赞 评论 收藏
分享