消消樂
我們可以考慮貪心,想一想,如果\(s\)串和\(t\)串中有一個字母相同的話,是不是就相當于必然存在\(S,t\)相同(將兩個字串刪減成一個字母就可以了)
C:
#include<stdio.h>
#include<string.h>
char s[1000001], t[1000001];
int v[52];
int main(){
scanf("%s%s", s, t);
int n = strlen(s), m = strlen(t);
for(int i = 0; i < n; i++){
if('a' <= s[i] && s[i] <= 'z')v[s[i] - 'a'] = 1;
else v[s[i] - 'A' + 26] = 1;
}
for(int i = 0; i < m; i++){
if('a' <= t[i] && t[i] <= 'z'){
if(v[t[i] - 'a']){
printf("YES");
return 0;
}
}
else{
if(v[t[i] - 'A' + 26]){
printf("YES");
return 0;
}
}
}
printf("NO");
}
C++:
#include<bits/stdc++.h>
int main(){
std::string s, t;
std::cin >> s >> t;
std::array<bool, 52> v{};
for(int i = 0; i < s.size(); i++){
if('a' <= s[i] && s[i] <= 'z')v[s[i] - 'a'] = 1;
else v[s[i] - 'A' + 26] = 1;
}
for(int i = 0; i < t.size(); i++){
if('a' <= t[i] && t[i] <= 'z'){
if(v[t[i] - 'a']){
std::cout << "YES";
return 0;
}
}
else{
if(v[t[i] - 'A' + 26]){
std::cout << "YES";
return 0;
}
}
}
std::cout << "NO";
}
Amazing number!
- 直接回圈判斷
- 先判斷這個數字是否是質數,再判斷回文,然后累加到答案上
code:
C:
#include <stdio.h>
#include <stdlib.h>
int is_palindrome(int n)
{
int a = n, b= 0;
while (n > 0)
{
b = b * 10 + n % 10;
n /= 10;
}
if (a == b) return 1;
else return 0;
}
int is_prime(int n)
{
if(n<2) return 0;
for(int i=2;i<=n/i;i++)
{
if(n%i==0) return 0;
}
return 1;
}
int main()
{
int l,r;
scanf("%d%d",&l,&r);
int ans=0;
for(int i=l;i<=r;i++)
{
if(is_prime(i)&&is_palindrome(i))
{
ans++;
}
}
printf("%d\n",ans);
}
C++
#include <bits/stdc++.h>
using namespace std;
bool is_prime(int n)
{
if(n<2) return false;
for(int i=2;i<=n/i;i++)
{
if(n%i==0) return false;
}
return true;
}
bool is_palindrome(int n)
{
string a=to_string(n);
string b=a;
reverse(b.begin(),b.end());
if(a==b) return true;
else return false;
}
void solve()
{
int l,r;
cin>>l>>r;
int ans=0;
for(int i=l;i<=r;i++)
{
if(is_prime(i)&&is_palindrome(i))
{
ans++;
}
}
cout<<ans<<'\n';
}
int main()
{
solve();
}
LeetCode 1
讀題可以知道,如果前面兩個出現的數字出現并且連續,那么相當于前面雙周賽,否則,就是單周賽
C:
#include <stdio.h>
int a[15];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
if (a[n] - a[n - 1] == 1) {
printf("1\n");
} else {
printf("2\n");
}
return 0;
}
C++:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> arr(n+1,0);
for(int i=1;i<=n;i++) cin>>arr[i];
if(arr[n]==arr[n-1]+1) cout<<1<<'\n';
else cout<<2<<'\n';
}
scz的小難題
考慮到情況很多,可以先給\(a,b,c\)排一個序,對于\(a,b,c\)三種數字,如果將\(a\times b\)賦值給\(c\),然后再將\(a\times b\)賦值給\(a\),然后\(a,c\)相減,那么最多\(3\)步就可以將出現\(0\)了,所以答案最多是\(3\),然后其他可以分類情況進行討論就可以了~~
- 如果其中有\(0\),那么答案就是\(0\)
- 如果\(a=b||b=c||a=c\) 那么答案就是1
- 如果\(a+b=c||a+a=b||a+a=c||b+b=c\) 答案就是2
- 如果\(a\times b=c||b\times c=c||a\times b=b\) 答案就是2
- 其余情況就是3
(注意有一個十分坑的資料:43073 99716 99972 不開\(long long 過不去\))
具體特殊樣例可以看代碼:
C:
#include <stdio.h>
#include <stdlib.h>
long long max(long long a,long long b,long long c)
{
if(a>=b&&a>=c) return a;
if(b>=a&&b>=c) return b;
if(c>=b&&c>=a) return c;
}
long long min(long long a,long long b,long long c)
{
if(a<=b&&a<=c) return a;
if(b<=a&&b<=c) return b;
if(c<=b&&c<=a) return c;
}
void solve()
{
long long a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
long long maxn=max(a,b,c);
long long minn=min(a,b,c);
long long mid=a+b+c-maxn-minn;
a=minn;
b=mid;
c=maxn;
if(a==0||b==0||c==0) printf("0\n");
else if(a==b||b==c||a==c) printf("1\n");//兩個數字相同
else if(a+b==c||a+a==b||a+a==c||b+b==c) printf("2\n");//兩數相加等于另一個數字
else if(a*b==c) printf("2\n");// 2 3 6 相乘等于另一數字
else if(b*c==c) printf("2\n");// 1 1 5
else if(a*b==b) printf("2\n"); //1 5 6
else printf("3\n");//其他情況
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return (0^0);
}
C++:
#include <bits/stdc++.h>
using namespace std;
void solve()
{
vector<long long> arr(3,0);
sort(arr.begin(),arr.end());
long long a=arr[0];
long long b=arr[1];
long long c=arr[2];
if(a==0||b==0||c==0) cout<<"0"<<'\n';
else if(a==b||b==c||a==c) cout<<1<<'\n';//兩個數字相同
else if(a+b==c||a+a==b||a+a==c||b+b==c) cout<<2<<'\n';//兩數相加等于另一個數字
else if(a*b==c) cout<<2<<'\n';// 2 3 6 相乘等于另一數字
else if(b*c==c) cout<<2<<'\n';// 1 1 5
else if(a*b==b) cout<<2<<'\n'; //1 5 6
else cout<<3<<'\n';//其他情況
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//注意開解綁
int T=1;
cin>>T;
while(T--) solve();
return (0^0);
}
stO SCZ Orz
考慮到a的數字很大,所以不適合用普通的a%b來進行計算,如果你會java或者python,可以使用相關的大整數來進行計算,但是后臺只開了1s時限,Java會超,Py資料會答案錯誤(zzuli的毛病, 所以說只能用C/C++(
考慮到 \((a+b)\mod c\)=\(a\mod c+b\mod c\)
可以根據秦九韶演算法將\(a\)進行分解,比如 \(234=200+30+4\)分解,然后將
根據\((a+b)\mod c\)=\(a\mod c+b\mod c\)中,然后套入即可,
C:
#include <stdio.h>
#include <string.h>
#define N 1000010
const int mod=1e9+7;
char a[N];
int main()
{
int b;
scanf("%s%d",a,&b);
long long ans=0;
int n=strlen(a);
for(int i=0;i<n;i++)
{
ans=(ans*10%b+(a[i]-'0'))%b;
}
printf("%lld",ans);
}
C++:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
int b;
cin>>a>>b;
long long ans=0;
for(int i=0;i<a.size();i++)
{
ans=(ans*10%b+(a[i]-'0'))%b;
}
cout<<ans<<'\n';
}
LeetCode 2
考慮到\(n\leq 1000\) 所以說只要會冒泡排序就可以直接過了,注意一下怎么比較,然后排序就可以了~~
C:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int name;
int score;
int time;
int errorNumber;
}b[1001];
int a[5];
int main() {
scanf("%d %d %d %d", &a[1], &a[2], &a[3], &a[4]);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
b[i].name = i, b[i].time = -1, b[i].score = 0, b[i].errorNumber = 0;
for (int j = 1; j <= 4; ++j)
{
int x, y;
scanf("%d %d", &x, &y);
if (x == -1) {
continue;
}
b[i].score += a[j];
if (b[i].time < x) {
b[i].time = x;
}
b[i].errorNumber += y;
}
}
for (int i = 1; i <= n - 1; ++i)
{
for (int j = 1; j <= n - i; ++j)
{
if (b[j].score < b[j + 1].score)
{
struct node temp = b[j];
b[j] = b[j + 1];
b[j + 1] = temp;
} else if(b[j].score == b[j + 1].score)
{
int x = b[j].time + 20 * b[j].errorNumber;
int y = b[j + 1].time + 20 * b[j + 1].errorNumber;
if(y < x)
{
struct node temp = b[j];
b[j] = b[j + 1];
b[j + 1] = temp;
} else if(y == x)
{
if(b[j + 1].name < b[j].name)
{
struct node temp = b[j];
b[j] = b[j + 1];
b[j + 1] = temp;
}
}
}
}
}
for (int i = 1; i <= n; ++i) {
printf("%d ", b[i].name);
}
return 0;
}
C++:
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int id;
int score;
int last=0;
int pently;
int sum;
bool operator <(const Node &other) const
{
if(score!=other.score) return score>other.score;
if(sum!=other.sum) return sum<other.sum;
return id<other.id;
}
};
void solve()
{
vector<int> score(5,0);
for(int i=1;i<=4;i++) cin>>score[i];
int n;
cin>>n;
vector<Node> arr(n+1);
for(int i=1;i<=n;i++)
{
arr[i].id=i;
for(int j=1;j<=4;j++)
{
int times,pently;
cin>>times>>pently;
if(times==-1) continue;
arr[i].score+=score[j];
arr[i].pently+=20*(pently);
arr[i].last=max(arr[i].last,times);
}
}
for(int i=1;i<=n;i++)
{
arr[i].sum=arr[i].last+arr[i].pently;
}
sort(arr.begin()+1,arr.end());
for(int i=1;i<=n;i++) cout<<arr[i].id<<' ';
cout<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--) solve();
return (0^0);
}
完美數
假設我們要找的數是 \(num\),我們發現只要一個數是合數,它就一定能寫成 \(k*x\) ( \(x\) 是質數)的形式,若 \(gcd(num,x) \neq 1\),則定有 \(gcd(num,kx) \neq 1\),所以我們只需要考慮小于等于 \(n\) 的質數就可以了,讓 \(num\) 與這些質數的最大公約數不等于 \(1\) 就行了,這個最小的 \(num\) 就是讓這些質數相乘,
#include <stdio.h>
const int mod = 1e9 + 7;
int is_prime(int num){
if(num == 1)return 0;
for(int i = 2; i <= num / i; i++)
if(num % i == 0)return 0;
return 1;
}
int main()
{
int n;
scanf("%d", &n);
int ans = 1;
for(int i = 2; i <= n; i++)
{
if(is_prime(i))ans = (long long)ans * i % mod;
}
printf("%d", ans);
}
C++:
#include <bits/stdc++.h>
constexpr int mod = 1e9 + 7;
bool is_prime(int num)
{
if(num == 1)return 0;
for(int i = 2; i <= num / i; i++)
{
if(num % i == 0)return 0;
}
return 1;
}
int main()
{
int n;
std::cin >> n;
int ans = 1;
for(int i = 2; i <= n; i++)
{
if(is_prime(i))ans = (long long)ans * i % mod;
}
std::cout << ans;
}
C++另一種寫法 :
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int get(int n)
{
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
return i;
}
}
return n;
}
void solve()
{
int n;
cin>>n;
long long ans=1;
map<int,int> mp;
for(int i=2;i<=n;i++)
{
long long temp=get(i);
if(!mp.count(temp))
{
mp[temp]++;
ans=ans*temp%mod;
}
}
cout<<ans%mod<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
// cin>>T;
while(T--) solve();
return (0^0);
}
數數 (easy version)
這里只要比較\(A_i\times A_j\leq A_i+A_j\)即可,發現只要分類討論就可以了
這里為了更好的表達,原題轉化成\(a\times b\leq a+b\)即可
- \(a,b\)中正負號相反,即一個是負數,一個是正數,滿足題意
- 如果全部都是\(1\),那么也是符合的
- 如果是全部都是\(0\),那么也是符合的
- \(1\)和其他的正數也是符合條件的,
- 所有的\(2\)也是符合條件的
- 其余的情況,根據小學二年級的均值不等式,顯然不成立~~
C:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int mod=1e9+7;
#define N 1000010
int arr[N];
void solve()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
int pos=0;
int neg=0;
for(int i=1;i<=n;i++)
{
if(arr[i]>0) pos++;
else if(arr[i]<0) neg++;
}
long long ans=1ll*pos*neg%mod;
int number1=0;
int other=0;
int number2=0;
int number0=0;
for(int i=1;i<=n;i++)
{
if(arr[i]==1) number1++;
if(arr[i]==2) number2++;
if(arr[i]!=1&&arr[i]>1) other++;
if(arr[i]==0) number0++;
}
ans=(ans%mod+1ll*number1*(number1-1)/2%mod+mod)%mod;
ans=(ans%mod+1ll*number0*(number0-1)/2%mod+mod)%mod;
ans=(ans%mod+1ll*number1*other%mod+mod)%mod;
ans=(ans%mod+1ll*number0*pos%mod+mod)%mod;
ans=(ans%mod+1ll*number2*(number2-1)/2%mod+mod)%mod;
printf("%lld\n",ans);
}
int main()
{
int T=1;
// cin>>T;
while(T--) solve();
return (0^0);
}
C++:
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
void solve()
{
int n,k;
cin>>n>>k;
vector<int> arr(n+1,0);
for(int i=1;i<=n;i++) cin>>arr[i];
int pos=0;
int neg=0;
for(int i=1;i<=n;i++)
{
if(arr[i]>0) pos++;
else if(arr[i]<0) neg++;
}
long long ans=1ll*pos*neg%mod;
int number1=0;
int other=0;
int number2=0;
int number0=0;
for(int i=1;i<=n;i++)
{
if(arr[i]==1) number1++;
if(arr[i]==2) number2++;
if(arr[i]!=1&&arr[i]>1) other++;
if(arr[i]==0) number0++;
}
ans=(ans%mod+1ll*number1*(number1-1)/2%mod+mod)%mod;
ans=(ans%mod+1ll*number0*(number0-1)/2%mod+mod)%mod;
ans=(ans%mod+1ll*number1*other%mod+mod)%mod;
ans=(ans%mod+1ll*number0*pos%mod+mod)%mod;
ans=(ans%mod+1ll*number2*(number2-1)/2%mod+mod)%mod;
cout<<ans%mod<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
// cin>>T;
while(T--) solve();
return (0^0);
}
數數 (hard version)
\(A_i*A_j<=A_i+A_j+K\)
化簡一下 \(A_i<=1+\frac{K+1}{A_j-1}\)
列舉 \(A_j\) 即可
#include <bits/stdc++.h>
using namespace std;
#define ll long long
constexpr int mod = 1e9 + 7;
void solve(){
int n, k = 0;
cin >> n >> k;
vector<int> a(n);
for(int& i : a)cin >> i;
ll ans = 0;
for(int i = n - 1, cnt = 0; i >= 0; i--){
ans = (ans + cnt) % mod;
cnt += a[i] == 1;
}
for(int i = 2; i <= k + 2; i++){
int lim = 1 + (k + 1) / (i - 1);
for(int j = n - 1, cnt = 0; j >= 0; j--){
if(a[j] <= lim)ans = (ans + cnt) % mod;
cnt += a[j] == i;
}
}
for(int i = n - 1, cnt = 0; i >= 0; i--){
if(a[i] <= 1)ans = (ans + cnt) % mod;
cnt += a[i] >= k + 3;
}
for(int i = 0; i >= -k; i--){
int lim = 1 + (k + 1) / (i - 1);
for(int j = n - 1, cnt = 0; j >= 0; j--){
if(a[j] >= lim)ans = (ans + cnt) % mod;
cnt += a[j] == i;
}
}
for(int i = n - 1, cnt = 0; i >= 0; i--){
if(a[i] >= 1)ans = (ans + cnt) % mod;
cnt += a[i] <= -k - 1;
}
cout << ans << "\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
solve();
}
This is a very hard problem
閱讀題意便知道,輸出\(a+b\)即可,注意不要爆\(int\),開\(long long\)
C/C++:
#include <stdio.h>
int main()
{
long long a,b;
scanf("%lld%lld",&a,&b);
printf("%lld",a+b);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523197.html
標籤:其他
