题意:给一个长度为n的数组,可以进行任意次操作:对于所有的i,j满足i≠j使得ai=aj,使得最后的数组元素和为奇数。
思路:很简单,如果n为奇数看看数组里有没有奇数,有就可以,如果n为偶数看看数组里是否同时含有奇数和偶数,有就可以
代码
/*
Keep clam Believe youself
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define Xiaobo main
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f;
typedef long long ll;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);}
int Xiaobo()
{
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
int j=0,o=0;
for(int i=1;i<=n;i++) {
int x;
scanf("%d",&x);
if(x%2) j=1;
else o=1;
}
if(n%2&&j) cout<<"YES\n";
else if(n%2==0&&j&&o) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
题意:某某有s元,可以买x元的东西,返回x/10向下取整的金额,问最多可以买多少元的商品
思路:乱搞暴力吧,指定有公式吧,本来我想的是(s+s/10)/10+s结果发现不太行,哈哈然后就看了好多人过了就爆吧,,,
/*
Keep clam Believe youself
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define Xiaobo main
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f;
typedef long long ll;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);}
int Xiaobo()
{
int t;
cin>>t;
while(t--) {
int s;
scanf("%d",&s);
ll sum=0;
while(s>=10) {
int k=s/10;
sum+=k*10;
s%=10;
s+=k;
}
cout<<sum+s<<'\n';
}
return 0;
}
题意:给一个字符串包含"ULRD",U代表向上移动一格,L代表向左移动一格,R代表向右移动一格,D代表向下移动一格,问是否可以删除一些连续序列使得对最后的位置没有影响。还有个坑的地方,刚开始没看到 要要求这个序列尽可能的小 比如有个RULDRL显然把第5,6个字符删除了最小
思路:用map记录下每个位置,如果当前位置在之前出现过(此时肯定可以删除一段序列因为之前已经到达过这个位置,那么之间的序列就是无用的)就去记录答案顺便更新下最小值,,,
代码:
/*
Keep clam Believe youself
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define Xiaobo main
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f;
typedef long long ll;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);}
typedef pair<int,int>PII;
map<PII,int>mp;
int Xiaobo()
{
int t;
cin>>t;
while(t--) {
string s;
if(!mp.empty()) mp.clear();
int n;
cin>>n;
cin>>s;
int x=0,y=0;
int flag=0;
int ansx=0,ansy=mod;
for(int i=0;i<s.size();i++) {
mp[{
x,y}]=i+1;
if(s[i]=='L') x--;
if(s[i]=='R') x++;
if(s[i]=='U') y++;
if(s[i]=='D') y--;
PII p={
x,y};
if(mp[p]) {
flag=1;
//cout<
//break;
if(i+1-mp[p]<ansy-ansx) {
ansx=mp[p];
ansy=i+1;
}
mp[p]=i+1;
}
else mp[p]=i+1;
}
if(!flag) cout<<-1<<'\n';
else cout<<ansx<<' '<<ansy<<'\n';
}
return 0;
}
题意:有n个怪物排成一排,每个怪物都有一定的血量值HP。你和你的对手一起去打怪升级,你的攻击力是a,对手的攻击力是b,每次都是轮流攻击,假如你的最后一次攻击打败了怪兽那么你就得1分,反之不得分,你有k次魔法操作,可以使得对手跳过本回合,这样你就可以攻击怪物了,当怪物血量小于0时即被打败。问:最多可以得多少分?
思路:
贪心吧,先预处理出每个怪物如果被自己打败需要多少次魔法操作,然后排下序,扫一遍数组记录答案就行了。预处理的时候是算yu=num[i]%(a+b),如果余数等于0就算最后一次操作,及怪物的剩余血量值为yu=b否则就让yu-=a,其实就是模拟最后一次你攻击以后怪物剩余的血量值,然后看这样的血量值下需要的最小的魔法操作,及如果**(yu%a)?(yu/a+1):(yu/a)**,,,挺好想的,
代码:
/*
Keep clam Believe youself
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define Xiaobo main
using namespace std;
const int maxn=2e5+7;
const int mod=1e9+7;
const double eps=1e-15;
const double pi=acos(-1);
const int INF=0x3f3f3f;
typedef long long ll;
ll read(){
ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar();if(c == '-')Nig = -1,c = getchar();while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar();return Nig*x;}
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);}
int num[maxn];
int xy[maxn];
int Xiaobo()
{
int n,a,b,k;
cin>>n>>a>>b>>k;
ll zg=a+b;
for(int i=1;i<=n;i++) {
cin>>num[i];
int yu=num[i]%(a+b);
if(yu==0) yu=b;
else yu-=a;
if(yu<=0) {
xy[i]=0;
continue;
}
int ans=(yu%a)?(yu/a+1):(yu/a);
xy[i]=ans;
}
sort(xy+1,xy+1+n);
int sum=0;
for(int i=1;i<=n;i++) {
if(k>=xy[i]) sum++,k-=xy[i];
else break;
}
cout<<sum<<'\n';
return 0;
}
E、F还是太弱了,就剩30分钟了没调出来,明天再补吧,本来今天的牛客很自闭,导致心情不是很好还记错时间了开局15分钟才过来,总结下这场cf还好吧,有所收获,有所不足,继续补题加油吧!!!Never give up!Never give up!Never give up!