A题 解题思路:
给予n个数字,让你求出最小的。(思维)
01 可以互换位置,11可以删除,所以我们就将1都换到前面,然后两个两个减去就好,最后只剩下一个。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const long long M = 1e9 + 7;
const int N = 300;
typedef long long ll ;
int main(){
int n;
scanf("%d",&n);
string st;
cin>>st;
int a = 0;
int b = 0;
for (int i = 0 ; i < n; i++){
if (st[i] == '1'){
a ++;
}
else{
b++;
}
}
if (a == 0){
printf("0");
}
else{
printf("1");
for (int i = 0; i < b; i++){
printf("0");
}
}
return 0;
}
也是一道思维吧,处理好奇偶就OK,首先走 n 步,让第一列走完,然后从剩下的开始 s 型走, 总共 k 次,我们走完第一列,剩下 k - n ,然后剩下m - 1列,我们用 k - n / m - 1 算出走了多少行,然后判断奇数偶数,偶数从左到右,奇数从右到左,然后取余求剩下走的步数即可。(处理好细节)
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const long long M = 1e9 + 7;
const int N = 300;
typedef long long ll ;
int main(){
ll n , k ,m;
scanf("%lld%lld%lld",&n,&m,&k);
if (k <= n -1){
printf("%lld 1\n",1 + k);
}
else{
ll res = k ;
res = res - n;
m = m - 1;
ll y ;
ll p = res / m ;
ll q = res % m;
ll x = p;
x = n - p;
if (p % 2 == 0){
y = 2 + q; // 注意下是从2开始了不是从 1 开始
}
else{
y = m + 1 - q;
}
printf("%lld %lld\n",x,y);
}
return 0;
}
给予n,然后给予 n 段区间,求是否存在包含关系。(贪心问题)
首先我们存入所有点,按照左端点升序排,右端点降序排,然后从大到小,自然是左端点越来越小,所以只判断右端点即可。
(这里右端点要从大到小,如果从小到大,显然如果在最后一点符合,那么答案肯定是错误的 )
比如 : (1,2) , (1,3),(14),显然答案是 1 2,但是如果升序,那么没答案,显然是错误的
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const long long M = 1e9 + 7;
const int N = 300010;
typedef long long ll ;
struct solve {
int l,r,x;
}ans[N];
bool cmp(solve a,solve b){
if (a.l == b.l) return a.r > b.r;
return a.l < b.l;
}
int main(){
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++){
scanf("%d%d",&ans[i].l,&ans[i].r);
ans[i].x = i + 1;
}
sort(ans,ans + n, cmp);
int mx = ans[0].r;
int x = ans[0].x;
int p = 0;
for (int i = 1; i < n; i++){
if (ans[i].r <= mx){
p = 1;
printf("%d %d",ans[i].x,x);
break;
}
else{
mx = ans[i].r;
x = ans[i].x;
}
}
if (p == 0){
printf("-1 -1\n");
}
return 0;
}